把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

UOJ #771. 【UER #11】科考工作

我觉得这个题还是很牛的!

考虑它给我 \(2N-1\) 个点有什么用,首先如果一个数出现 \(\geq N\) 次就显然这种数取 \(n\) 个就好了,否则总可以两两配对使得配对的两个数不同,最后剩一个数。

可以说明,剩下的一个数必须选,其余的一组中选择恰好一个,能在模意义下表示出 \(0\)。这不强于任意 \(N-1\) 个非 \(0\) 数能表示出所有数。而后面的证明可以考虑当前已经能表示出的数的集合 \(S\),若 \(S=S+x\),因为 \(n\) 是质数,所以说明 \(S\) 是全集,否则每增加一个 \(x\) 至少将 \(S\) 集合扩大一个。初始 \(S=\{0\}\),经过 \(N-1\) 次操作后一定是全集。

现在我们已经可以会一个 \(O(\frac{N^2}{\omega})\) 的做法了:枚举每个数 \(w\),找到一个位置 \(x\) 使得 \(x\) 在集合里但是 \((x+w)%N\) 不在,用 bitset 优化这个过程。

接下来有两个做法,一个是将所有 \(w\) 相同的放在一起考虑并 random_shuffle,如果将每次模坐标变换之后可以被表示出的数看成均匀随机的话,复杂度就是 \(O(n\log n)\) 的,但是我也不知道怎么证明它是均匀随机的。

另一个做法是,等下这个做法好像假了

但是我们还有第三个做法!假设当前要加入的数是 \(x\),随便找一个位置 \(v\) 满足还不能被表示,则在 \(0\to x\to 2x\bmod n\to 3x\bmod n\to\dots\to v\) 这条链上二分,就能找到一个前面是 \(0\) 后面是 \(1\) 的位置了。这个做法是确定性的 \(O(n\log n)\),但是比随机化常数略大。

随机化 submission

确定性 submission

posted @ 2024-06-27 18:13  275307894a  阅读(25)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end