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\)

\[\text{maxv}(d,x)=\max\{\text{maxv}(d-1,x),\text{maxv}(d-1,y)+2^d\}\\\text{maxv}(d,y)=\max\{\text{maxv}(d-1,y),\text{maxv}(d-1,x)+2^d\} \]

\(\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)\) 即可。

[ICPC2017 WF] Money for Nothing

\(\mathcal{S}\text{olution.}\)

posted on 2020-12-03 12:19  Oxide  阅读(130)  评论(0编辑  收藏  举报