6.17 CW 模拟赛 T4. 异或
前言
其实说, 认真去看, 缓慢耐心还是看得懂题解的
思路
放到 \(\rm{trie}\) 树上考虑
从高到低考虑位, 每次只考虑当前子树的方案数
如果当前位 \(p\) 使得 \(2^p \geq x\), 我们就可以直接递归下去处理两棵子树的方案了, 两棵子树的方案任意组合都行
否则我们只能选择一个数或者干脆不选, 要么就两边子树各选一个
我们一定会在某个阶段进入「两边子树各选一个」的状态
只需要根据当前这一位是否必须是 \(1\) 来讨论
- 如果必须是 \(1\), 那我们只能选这一位不同的数
- 如果可以是 \(0\) 或者 \(1\), 可以任意选取
其中当前这一位是否必须是 \(1\), 我们可以维护还需要多少才能 \(\geq x\) 来确定, 这基于 \(2^p > \sum_{k = 1}^{p - 1} 2^k\)
每次递归时如果当前位为 \(1\) 就把这个值减去 \(2^p\) 即可了
如果这个值已经 \(\leq 0\), 那么我们在当前状态中可以任选两个数组合就行
总结
不太好想到的是放到 \(\rm{trie}\) 上
这个太牛了没办法
看不懂了可以借鉴 六楼溜刘的小窝-20230624B
对一类要求任意对都满足某种条件的, 往往有以下两种做法
- 观察到一些性质, 把任意对转化成相邻对/...
- 分治法, 每次拆分成两个部分, 满足只要两个部分中的任意对满足条件, 那当前部分的任意对都满足条件

浙公网安备 33010602011771号