loading

AT_wtf22_day2_e Adjacent Xor Game

题意

给定 \(a_1,a_2,\cdots,a_n\),先手要在其中选出 \(k\) 个数 \(x_1,x_2,\cdots,x_k\),然后后手会构造 \(2k\) 个数 \(y_1,y_2,\cdots,y_{2k}\),使得多重集 \(\{y_1\oplus y_2,y_3\oplus y_4,\cdots,y_{2k-1}\oplus y_{2k}\}=\{x_1,x_2,\cdots,x_k\}\),你需要保证 \(y_i\le y_{i+1}\),得分为 \(y_{2k}\)。

先手想最大化得分,后手想最小化得分。对于每个 \(k\) 求出最终得分是多少。

\(n\le 2.5\times10^5,1\le a_i\le 10^9\)

分析

考虑 \(k=n\),考虑 \(y\) 的差分,则我们想要求的是:往 \(x\) 中插入若干个元素使得存在一种重排方案使得前缀异或和不降,得分为全局异或和。由于 \(x\) 中的元素在重排方案中距离 \(\ge 2\) 可以缩成一个数,若距离为 0 可以添加一个 \(0\) 使答案不变,并且元素越多显然越不优,所以很多原题有的限制在新问题下不需要考虑了。(我咋连这都想不明白)

先考虑重排方案的存在性。从高往低考虑每一位 \(p\),假设我们已经填的所有 \(highbit>p\) 的数,考虑所有 \(highbit=p\) 的数,若只有一个那显然皆大欢喜,若 \(\ge 2\) 个那么两个这样的数之间必然会有至少一个 \(highbit>p\) 且第 \(p\) 位为 1 的数以满足限制。则,我们设 \(a\) 为 \(highbit=p\) 的数量,\(b\) 为 \(highbit>p\) 且第 \(p\) 位为 1 的数量,则存在重排方案当且仅当对于所有 \(p\) 皆有 \(a\le b+1\)(因为 \(highbit>p\) 的那些数全部严格递增所以相对顺序不变就不会影响 \(p\) 位的单调性)。

再考虑答案 \(s\) 的存在性。注意一个小细节,上面的 \(a\le b+1\) 此时应该改为 \(a\le b+s_p\),\(s_p\) 为 \(s\) 在第 \(p\) 位上的值(0 或 1)。这是因为当 \(s_p\) 为 \(0\) 时只能填偶数个该位为 0 的数,而之所以 \(a\) 能取到 \(b+1\) 是因为 \(a\) 可以插在开头结尾以及所有缝隙中,这会导致填了奇数个。注意若你实际上的 \(a\) 和 \(s_p\) 奇偶性不同,则你多填一个 \(highbit=p\) 的数一定不劣,所以不需要考虑这个限制。

还是考虑第 \(p\) 位,设 \(a_p\) 为 \(x\) 中 \(highbit=p\) 的数量,\(b_p\) 为 \(x\) 中 \(highbit>p\) 且第 \(p\) 位为 1 的数量。再设 \(c_p\) 为新添加的数中(设为 \(z\),显然有 \(x\cup z=y\))第 \(p\) 位为 1 的数量(注意这里没有要求 \(highbit=p\),当然要求也可以,但不利于我们后续做题)。对于 \(c_p\),在 \(p\) 之上的位上,为了让之后的位更可能的符合存在重排的条件,我们肯定会在符合 \(a_p\le b_p+s_p\) 的前提下尽可能的插入这一位及以下的所有位为 \(1\) 的数,所以 \(c_p\) 必然会填到最大值。

据此,我们能写出关于 \(c_p\) 的恒等式:\(c_p-c_{p+1}=c_{p+1}+b_p+s_p-a_p\),限制是要求 \(c_p-c_{p+1}\ge 0\) 也就是 \(c_{p+1}+b_p+s_p-a_p\ge 0\)。由于 \(c_p=2c_{p+1}+b_p+s_p-a_p\),所以将关于 \(c_{p+1}\) 的式子代进去得到 \(2c_{p+2}+b_{p+1}+s_{p+1}-a_{p+1}+b_p+s_p-a_p\ge 0\),再把 \(c_{p+2}\) 代进去得到 \(4c_{p+3}+2(b_{p+2}+s_{p+2}-a_{p+2})+b_{p+1}+s_{p+1}-a_{p+1}+b_p+s_p-a_p\ge0\),以此类推,我们最终会得到 \(b_p+s_p-a_p+\sum_{i>p} 2^{i-(p+1)}b_{i}+s_i-a_i\ge 0\),将常数项移过去得到 \(s_p+\sum_{i>p}2^{i-(p+1)}s_i\ge a_p-b_p+\sum_{i>p} 2^{i-(p+1)}(a_i-b_i)\)。

发现转化成了对 \(s\) 的限制,但还是不太好做,继续变换。两边同乘 \(2^{p+1}\) 得到 \(2^{p+1}s_p+\sum_{i>p}2^{i}s_i\ge 2^{p+1}(a_p-b_p)+\sum_{i>p}2^i(a_i-b_i)\),而左边实际上等于 \(\left\lfloor\dfrac{s}{2^p}\right\rfloor2^p+s_p2^p\)。考虑放缩一下,直接把左边放大成 \(s+2^p\),限制写成 \(s+2^p\ge 2^{p+1}(a_p-b_p)+\sum_{i>p}2^i(a_i-b_i)\)。这样写为什么是对的,或者说为什么不存在一个 \(s\) 使得满足老式子但不满足新式子?考虑到受影响的位只有 \(p\) 及以下的位,增加的值严格小于 \(2^{p+1}\) 次方,而等式右边的数全是 \(2^{p+1}\) 的倍数,所以毫无影响。

最终得到 \(s\ge 2^{p+1}(a_p-b_p)+\sum_{i>p}2^i(a_i-b_i)-2^p\),由于每个 \(p\) 都有一个类似这样的限制,答案即为 \(\max_p\{2^{p+1}(a_p-b_p)+\sum_{i>p}2^i(a_i-b_i)-2^p\}\)。

考虑 \(k\neq n\),相当于选出 \(k\) 个点最大化这个东西,首先相当于对每个 \(p\) 求出选 \(k\) 个点时的最大值,然后取 max,我们考虑拆贡献,一个数 \(v\) 会在 \(highbit\) 处贡献 \(2^i\),在非 \(highbit\) 的 1 处贡献 \(-2^i\),在第 \(p\) 位的贡献翻倍。那么我们取贡献最大的前 \(k\) 个点即可。时间复杂度 \(O(n\log V)\)。

int n,a[maxn],b[maxn],c[maxn];
i64 ans[maxn];
inline void solve_the_problem(){
	n=rd();
	rep(i,1,n)a[i]=rd();
	rep(i,1,n)ans[i]=b[i]=c[i]=0;
	per(j,29,0){
		rep(i,1,n){
			if((__builtin_clz(a[i])^31)==j)b[i]+=(1<<j),c[i]=b[i]+(1<<j);
			else if((a[i]>>j)&1)b[i]-=(1<<j),c[i]=b[i]-(1<<j);
			else c[i]=b[i];
		}
		sort(c+1,c+n+1,greater<int>());
		i64 sum=-(1<<j);
		rep(i,1,n)sum+=c[i],ckmx(ans[i],sum);
	}
	rep(i,1,n)write(ans[i]);
}
posted @ 2026-02-27 15:28  dcytrl  阅读(2)  评论(0)    收藏  举报