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。我们也就构造出了要求的序列。

对于不满足条件的图,则不存在题目要求的序列。

原文地址:https://www.cnblogs.com/gooooooo/p/12329918.html