Loading

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

对一类要求任意对都满足某种条件的, 往往有以下两种做法

  • 观察到一些性质, 把任意对转化成相邻对/...
  • 分治法, 每次拆分成两个部分, 满足只要两个部分中的任意对满足条件, 那当前部分的任意对都满足条件
posted @ 2025-06-18 17:29  Yorg  阅读(10)  评论(0)    收藏  举报