AHOI2022
-
首先缩环,每个环有个数量, 对于有个点交换就是两个环合起来,然后求 lcm
-
这里需要知道一个很简单但是很重要的结论:对于 \(\sum a_i=n\) ,不同的 \(a_i\) 只会有 \(\sqrt n\) 的数量级
-
所以先去重一下,然后暴力枚举,那么就是 \(O(n)\) 的了
-
那么现在就是要维护一个集合的 lcm ,支持删除添加
-
考虑质因数分解,那么就是对于每个质数的幂次维护最大
-
质因数的个数只有 \(O(\log )\) 的,虽然我也不会证
-
那么我们需要支持删除加入快速求最大值,因为只会删 2 个,所以考虑维护最大的 3 个幂次就可以了
-
考虑一种不重不漏的贡献方式,假设钥匙是 +1 ,宝箱是 -1 ,对于 +1+1-1-1,我们使 \((2,3)\) 和 \((1,4)\) 为两组贡献,可以发现这样子做后的贡献可以做到不重不漏
-
考虑对于每种颜色建立虚树,对于每个钥匙节点在相应的虚树上 dfs ,\(dp_y\) 表示到达这个节点时还剩的钥匙,那么如果还剩一把,那么自己和这个节点就可以算贡献了
-
也就是对应 \(x\to y\) ,如果路径 \(u\to v\) 覆盖 \(x\to y\) ,那么贡献加一
-
可以发现这样算的贡献确实是不重不漏
-
对于路径覆盖问题,可以转换变成 dfn 在某个区间
-
那么每个贡献可以看成一些矩形,每种路径看成二维平面的一个点,那么就是询问一个点能被多少个矩形覆盖了
-
这个就可以将二维平面的信息全部离线下来,然后做