题目
有一个长度为N的数列,每个数不超过$10^9$,顺序给出$M$个操作以及对应操作的结果。要求还原出那个数列,若有多个数列满足条件,输出每个数按位或的值最大的那个数列。原数列可能不存在。
操作有2种:
第一种:$l,r,x$。代表原数列下标在$[l,r]$范围内的最大的数为$x$。题目保证每个$x$都不相同。
第二种:$k,d$。代表将原数列中第$k$个数改为$d$。
数据范围
$1 \leq N, M, \leq 3 \times 10^5 \quad 0 \leq x \leq 10^9$
做法
对于此题,我们似乎做不了别的,只能求出满足条件的原数列中的每个数的最大值。(这可以用线段树在$O(M\times log_2N)O(M\times log_2N)$的时间内求出。)
将此数列当作原数列,对其进行$M$个操作。我们发现,若第$i$次操作的结果比所给结果小,那么原数列不存在,因为原数列中的数已经不可能更大了。若操作结果比所给结果大,那么原数列也不存在(此时是操作之间有矛盾)。
现在只要最大化此数列的或的结果。
若有大于等于$2$个自由(不被操作1所约束)的数,那么令一个等于$2^{29}$,另一个等于$2^{29}-1$,那么或的结果就最大了。
若自由数的个数小于$2$。先不考虑自由的数。对于每个至少出现$2$次的数,我们将其一个减少,方法为:将其二进制表示下的最左边的$2$反转,右边全变为$1$。如果有自由数的话,再贪心地将其二进制高位置$1$,并保证不超过$10^9$。
代码
|
|