abc155 F Perils in Parallel
题意
在\(X\)轴上有\(n\)个炸弹,每个炸弹坐标为\(A_i\),初始状态为\(B_i\)(0表示非激活,1表示激活)。有\(M\)个操作,每个操作可以使坐标在\([L_i,R_i]\)的炸弹反转状态。问是否存在一个操作序列使得所有炸弹不激活?存在则输出序列。
题解
炸弹先按坐标排序。
自定义一个操作\(O_i\)表示将前\(i\)个炸弹的状态反转。
声明一个数组\(D\),\(D_i\)表示进行\(D_i\)次\(O_i\)操作(次数要么是0次要么是1,因为反转2次和没反转等效)。我们可以通过从炸弹坐标从大到小求出能使最终所有炸弹不激活的\(D\)数组,且数组唯一。
下面转化一下\(L_i,R_i\)的值,通过lower_bound将其转换为可以使下标在\([L_i,R_i]\)的炸弹反转状态。
那么题目给出的一次操作等效于一次\(O_{l_i-1}\)操作加上一次\(O_{r_i}\)操作。相当于使得\(D\)数组中的两个值异或1。那么题目转化为如何通过题给操作得到\(D\)数组。
构造如下的图,\(M\)个操作,每个操作代表一条边,连接\(L_i-1,R_i\)。对于形成的图,进行一次题目操作,就是改变对应边两端的点的状态。因此每次有偶数个点的状态发生改变,要使图中的一个连通块中的所有顶点状态都变为0,必须满足它的初始状态有偶数个点状态不为0。
对于满足条件的图,我们可以从中任取一棵生成树。任取一点为根。深度从大到小处理。我们可以通过使用边的操作使得深度最深的那些点状态全变为0。逐层上推直到根结点。由于根节点所在深度只有一个点,而图又满足初始时偶数个点状态不为0,每次改变偶数个点的状态的性质,所以根节点最后状态一定为0。我们也就构造出了要求的序列。
对于不满足条件的图,则不存在题目要求的序列。