CodeForces - 1442D Sum
由 "数组是 不降 的" 可以推导出一个结论:最多只有一个数组选了但是没有选完。
考虑证明。假设有 \(i,j\) 两个数组分别选到第 \(p_i,p_j\) 的数,且 \(a_{i,p_i}\leqslant a_{j,p_j}\),由于有 \(a_{j,p_j}\leqslant a_{j,p_{j}+1}\),那么舍弃 \(a_{i,p_i}\) 而选取 \(a_{j,p_{j}+1}\) 肯定更优,且新的数组有 \(a_{i,p_i-1}\leqslant a_{j,p_j+2}\),差距还会更大。于是两个数组如果都选了且没有选完,则可以削弱其中一个,不停选另一个直到另一个数组全被选为止。
于是考虑枚举那个选了且没选完的数组,将其他数组抽象成一件物品分别进行背包,时间复杂度 \(\mathcal O(n^2k)\).
如何优化?每次选一个数组都跑其它数组其实有很多重复,可以利用分治来优化,比如先将 \([l,{\rm mid}]\) 中的数组看成一件物品,递归 \(({\rm mid},r]\),保证选了且没选完的数组在 \(({\rm mid},r]\) 之中。时间复杂度 \(\mathcal O(nk \log n)\).
CF1553H XOR and Distance
将这个问题放在 \(\rm trie\) 上考虑,当 \(x=0\) 时可以发现,最小值应当是树上所有点的 \(1\) 儿子的最小值减去 \(0\) 儿子的最大值再加上这一位代表的二进制幂,再取 \(\min\)。于是定义 \(f(d,x)\) 为 最低 \(d\) 位 可以不同的二元组 \((a,b)\),异或 \(x\) 的最小值,\(\text{maxv}(d,x),\text{minv}(d,x)\) 同理,表示与 \(x\) 最低 \(d\) 位可以不同的元素与 \(x\) 的最小异或和。这两个数组可以这样递推(不妨设 \(x\oplus y=2^{d},x<y\))
\(\rm minv\) 同理。
现在考虑 \(f(d,x)\) 的递推,我们分两种情况讨论:
- 对于第 \(d\) 位仍然相同的数字,首先肯定能从 \(f(d-1,x)\) 转移过来,其次由于 \((a\oplus x)-(b\oplus x)=(a\oplus y)-(b\oplus y)\),所以 \(f(d-1,x)\) 与 \(f(d-1,y)\) 应当是等价的;
- 对于第 \(d\) 位不同的数字,可以发现 \(\text{maxv}(d,x),\text{minv}(d,x)\) 与 \(\text{maxv}(d,y),\text{minv}(d,y)\) 中数字的第 \(d\) 位一定不同(现假设 \(b\) 是 \(y\) 对应集合中数字,\(a\) 是 \(x\) 对应集合中数字),且由于 \((b\oplus x)=(b\oplus y)+2^d\geqslant 2^d>(a\oplus x)\),所以直接取 \(\text{minv}(d,y)-\text{maxv}(d,x)\) 即可。