CF妙题口胡
由于坐标增长得很快,越到后面越稀疏,所以我们贪心地先往前走,再往后走。
我们只需要处理出所有再 \(t\) 之内能走到的点,最多 \(\log_2t\) 个。
如果第 \(i\) 个时间,空调可以开在 \([L,R]\),那么 \(d\) 秒后空调可以开在 \([L-d,R+d]\)。
以此我们将每次的空调区间与顾客区间做交,如果为空了,那么为 NO,否则我们为了让空调适应顾客,让空调区间变成这个交。
先离散化后将线段都排序。线段 \([l,r]\) 的存储,可以做成 \(l,i\) 和 \(r+1,-i\)。扫描每一个孩子,因为每个孩子被覆盖的线段不超过 \(8\) 个,所以我们可以将线段 \(8\) 循环编号。
状压,设 \(f(i,s)\) 为第 \(i-1\) 个孩子(离散化后)到第 \(i\) 个孩子(中间还会有许多被去的点)覆盖状态为 \(s\)。
如果这段的起点是添加咒语,设新咒语在状压中的位置为 \(k\):
-
若 \(s\) 的第 \(k\) 位为 \(1\),则 \(f(i,s)=f(i-1,\text{s的第k位设为0})+[s有奇数个1]\times \text{这段的长度}\)
-
若 \(s\) 的第 \(k\) 位为 \(0\),意味这我们没有施咒语,则 \(f(i,s)=f(i-1,s)+[s有奇数个1]\times \text{这段的长度}\)
如果这段的起点是解除咒语,设新咒语在状压中的位置为 \(k\):
-
若 \(s\) 的第 \(k\) 位为 \(1\),不可能存在这种情况,因为我们已经解除了啊。
-
若 \(s\) 的第 \(k\) 位为 \(0\),则 \(f(i,s)=\max\{f(i-1,\text{s的第k位设为1}),f(i-1,s)\}+[s有奇数个1]\times \text{这段的长度}\)
按位计算,假设现在在算第 \(k\) 位对答案的贡献,那么我们只用考虑每个数的末 \(k\) 位即可,这可以用取模,设 \(b_i=a_i\mod 2^{k+1}-1\)。
如果第 \(k\) 位对答案有贡献,说明有奇数对 \(b_i+b_j\) 的第 \(k\) 位为 \(1\)。
也就是说明 \(2^k\le b_i+b_j\le 2^{k+1}-1\) 或者出现进位的情况,即 \([2^k+2^k\times 2,2\times(2^{k+1}-1)]\)。
排序后走指针即可,可以分别两次走指针后相加。
用 \(S(i)\) 表示点 \(i\) 左边与它相连的点集合。
当 \(S(i)=S(j)\),可以合并权值,答案即为原先点权和。
然后再求 gcd。
由于异或是不进位加法,所以当 \(u>v\) 时,无解。
同时我们可以推出 \(a+b=a\oplus b+2(a\&b)\),也就是把要移位的地方手动移位了。
于是 \(a+b-a\oplus b=2(a\&b)\),设 \(\Delta=v-u\)。
若 \(\Delta\) 为奇数,无解。
当 \(\Delta=0\),若 \(u=v=0\),直接构造空数组,否则答案就是 \([u]\)。
当 \(\Delta>0\),可以构造 \([\frac{\Delta}{2},\frac{\Delta}{2},u]\) 或 \([\frac{\Delta}{2},\frac{\Delta}{2}\oplus u]\)。
由于 \(1\oplus2\oplus3=0\),所以最小权值个数一定是 \(1\) 或 \(3\)。

浙公网安备 33010602011771号