CF1322B Present & P3760 [TJOI2017] 异或和

CF1322B

考虑每一位的贡献,记当前位为 \(k\)

显然高位不会影响低位,那么将所有数 \(\bmod 2^{k+1}\)

那么第 \(k\) 位为 \(1\) 当且仅当 \(2^k \le a'_i+a'_j < 2^{k+1}\)\(2^{k+1}+2^k \le a'_i+a'_j < 2^{k+2}\)

排序+双指针可以做到 \(\mathcal O(n \log n \log A)\)

P3760 [TJOI2017] 异或和

同样经过一系列转化为求 \(a_i-a_j\) 的第 \(k\) 位为 \(1\) 的对数。

高位的值无关紧要,只会存在借位的 \(1\),同样可以直接将所有数 \(\bmod 2^{k+1}\)

那么得到: \(2^k \le a_j'-a_i' < 2^{k+1}\)\(2^k \le (a_j'+2^{k+1})-a_i' < 2^{k+1}\)

注意此时对 \(a_i,a_j\) 的大小关系有要求,只能依次加入,采用树状树组维护区间和可做到 \(\mathcal O(n \log^2 A )\)

总结

首先是套路的将异或和拆分位计算

然后将某一位的 0/1 限制转化为范围限制。

posted @ 2022-10-21 20:07  chihik  阅读(24)  评论(0编辑  收藏  举报