代码源
异或游戏
二分答案 \(S\),对于 \(a_i\oplus a_j\ge k\) 的 \((i,j)\) 连边,相当于判定最小团覆盖是否不超过 \(k\),也就是是否存在反图的 \(k\) 染色。
由于最小染色等于最大团,从最大团的角度入手存在简单的 dp 做法,但难以解决构造。
先不着急求出 \(k\) 染色,而是先发掘一些性质。
现在是 \(a_i\oplus a_j<k\) 的 \((i,j)\) 有边。
设 \(t\) 满足 \(2^t\le k<2^{t+1}\)。对 \(a_i\) 的低 \(t\) 位进行分组,组间互不影响,只需考虑组内。
再对第 \(t\) 位分成 01 两组,组内必须异色,组间异或和 \(\ge k\) 的可以共色,也就是求出最大匹配。
递归构造。得到的答案等价于从最大团的角度 dp 出的答案,非常神奇。
蚂蚁
同时收录于(非)人类题选做(2)。
考虑一个等价的随机过程,每次从摸牌堆中摸牌,如果摸到的牌已经有了 \(b_i\) 张就将其放入弃牌堆,不再重复摸牌。设摸牌堆中有 \(j\) 张牌,弃牌堆中有 \(k\) 张牌,摸牌一次的期望时间为 \(\frac{M-k}{M-j-k}\)。
由于期望的线性性,我们求出每一个 \(\frac{M-k}{M-j-k}\) 发生的概率。对于每一个局面,只和 \(j\) 和 \(k\) 有关,而与摸牌的顺序无关。所以对牌做背包,设 \(f_{i,j,k}\),讨论一下第 \(i\) 张牌放入了多少张转移,即可做到 \(O(n^3)\)。继续优化可以做到 \(O(n^2)\)。
哎?对吗?
显然不像是会有多项式复杂度的做法,因此考虑暴搜。
考虑两条路径 \(S,T\) 如果 \(S\subseteq T\) 则 \(S\) 完全劣于 \(T\)。因此考虑有用的路径集合,其中不存在包含关系。有个结论是这样的集合大小不超过 \(C(n,n/2)\)。由于是 DAG 上的路径,存在更精确的分析可以分析到 \(O(3^{n/3})\)。考虑 \(1\) 号点的出度若为 \(d\),则这 \(d\) 个点两两不可达,\(T(n)=T(n-d)d\)。
现在考虑如何做背包。按照性价比排序后贪心取,直到背包重量 \(\le B\) 剩下的部分暴力背包。可以证明正确性。

浙公网安备 33010602011771号