ABC252H

题面

\(c\) 个集合,\(n\) 个数,每个数 \(a_i\) 属于一个集合。

现在要在每个集合中选 \(1\) 个数,定义一个选法的权值为所有选的数的异或和。

求第 \(k\) 大选法的权值。

数据范围:\(c,n\le 70,a_i\le 2^{60},k\le 10^{18}\)

题解

开始认为选法只会有 \(2^{\frac{n}{2}}\) ,实际上是 \(3^{\frac{n}{3}}\) ,其实你只要发现 \(2^3=8<9=3^2\) 就知道了...

然后发现现在根本想不到一个重要的技巧了: Meet-in-the-middle !!!

有了 Meet-in-the-middle 的思路,我们大致给集合分成两边,使两边的方案数接近 \(\sqrt{3^{\frac{n}{3}}}\approx 4e5\)

这时候就只用建trie树,然后二分+查询就可以做到 \(O(400000\log^2 a_i)\) 。(其实就是CF241B Friends

但是,这题题解给出了一个神奇的单 \(\log\) 做法。(也就是那个题也可以做到单 \(\log\) !)

在逐位确定 \(mid\) 的时候,我们可以对trie 树上的节点动态维护当前处于节点的 \(\{a_i\oplus mid\}\)\(\{b_i\}\) ,这样我们知道接下来考虑下一位的时候会产生贡献的 \((a_i,b_j)\) 一定会在一个节点内。

这样可以直接计算之后,我们就能确定下一位取 \(0/1\) ,然后就可以把每个节点维护的集合下传给儿子。

这样一个数只会遍历 \(\log a_i\) 个节点,复杂度也就是单 \(\log\) 的。

实现上没必要显示建树,因为我们只需要关心 \(A,B\) 集合。

启发

  • Meet-in-the-middle!!!
  • 处理异或第 \(k\) 大的问题可以做到单 \(\log\)
posted @ 2022-06-06 23:01  qwq_123  阅读(41)  评论(0编辑  收藏  举报