乱 搞 题()

是真的乱搞.
模拟退火啥的还是太保守了(

当一个条件足够必要的时候, 它就是充分的.

当一个条件足够必要的时候, 它就是充分的.

随机一次概率小了, 就多随机几次.

随机一次概率小了, 就多随机几次.

1. luoguP8819 [CSP-S 2022] 星战

容易发现原问题就是要判断这个图是不是一棵内向基环树森林.
发现出度很难维护, 那就不要维护. 但是你发现入度是随手维护的.
注意到入度和等于出度和就是每个点出度都为 \(1\) 的一个必要条件.
受此启发我们考虑给每个点随机一个权值 \(w_u\), 重定义入度 \(I_u\) 为连向 \(u\) 的点的权值和. 这还是能随便维护.
这个时候我们就有这样的关系:

其中 \(O_u\) 还是原来的出度.
我们发现这时每个点出度都为 \(1\) 的一个必要条件就是:

我们神奇地发现因为 \(w_u\) 是随的, 在随机的数都比较大的时候, 上述方程很可能只有 \(O_u=1\) 一组解, 正确率极高.
因此我们只需要判断是否有 \(\sum I_u=\sum w_u\) 就完事了!

2. CF1746F Kazaee

这个就简单了, 直接随机数, 看区间和是不是 \(k\) 的倍数就完事了.
正确率有点低, 需要多随几次.

3. luoguP6817 [PA2013]Filary

显然答案下界为 \(\lceil\dfrac{n}{2}\rceil\). 这有什么用呢?
这说明我们可以直接随机一个 \(a_i\), 此时它在答案内的概率就超过了 \(\dfrac{1}{2}\). 因此我们多随机几次就能基本保证答案会被取到.
既然已经给定了一个 \(a_i\), 我们直接求出来它和其他数的差, 选出最多的数使 \(\gcd\) 大于 \(1\) 即可. 这个分解质因数随便做.
但是我们发现需要最大化 \(m\). 考虑将所有对应位置相同的质因数都给乘起来.
判断这个如果还要扫一遍的话时间复杂度就上去了. 方法是考虑再把位置给 Hash 一下, 比如赋随机权值取异或. 这样就没有问题了.

————————

是真的乱搞.
模拟退火啥的还是太保守了(

当一个条件足够必要的时候, 它就是充分的.

当一个条件足够必要的时候, 它就是充分的.

随机一次概率小了, 就多随机几次.

随机一次概率小了, 就多随机几次.

1. luoguP8819 [CSP-S 2022] 星战

容易发现原问题就是要判断这个图是不是一棵内向基环树森林.
发现出度很难维护, 那就不要维护. 但是你发现入度是随手维护的.
注意到入度和等于出度和就是每个点出度都为 \(1\) 的一个必要条件.
受此启发我们考虑给每个点随机一个权值 \(w_u\), 重定义入度 \(I_u\) 为连向 \(u\) 的点的权值和. 这还是能随便维护.
这个时候我们就有这样的关系:

其中 \(O_u\) 还是原来的出度.
我们发现这时每个点出度都为 \(1\) 的一个必要条件就是:

我们神奇地发现因为 \(w_u\) 是随的, 在随机的数都比较大的时候, 上述方程很可能只有 \(O_u=1\) 一组解, 正确率极高.
因此我们只需要判断是否有 \(\sum I_u=\sum w_u\) 就完事了!

2. CF1746F Kazaee

这个就简单了, 直接随机数, 看区间和是不是 \(k\) 的倍数就完事了.
正确率有点低, 需要多随几次.

3. luoguP6817 [PA2013]Filary

显然答案下界为 \(\lceil\dfrac{n}{2}\rceil\). 这有什么用呢?
这说明我们可以直接随机一个 \(a_i\), 此时它在答案内的概率就超过了 \(\dfrac{1}{2}\). 因此我们多随机几次就能基本保证答案会被取到.
既然已经给定了一个 \(a_i\), 我们直接求出来它和其他数的差, 选出最多的数使 \(\gcd\) 大于 \(1\) 即可. 这个分解质因数随便做.
但是我们发现需要最大化 \(m\). 考虑将所有对应位置相同的质因数都给乘起来.
判断这个如果还要扫一遍的话时间复杂度就上去了. 方法是考虑再把位置给 Hash 一下, 比如赋随机权值取异或. 这样就没有问题了.