CF1439
CF1439A1 & A2 [* easy]
很麻烦的做法:
假设 (n<m) 那么 swap(n, m) 然后继续:
逐行考虑并将问题转换为子问题,对于每一行我们在 (lceilfrac{m}{2} ceil) 次操作解决此问题即可。
对于最后一行我们暴力做就可以了。
然而均摊下来最后一行的每个 (1) 需要 3 次操作(连续的 (11) 是 2 个)在 (n=m=3) 的时候可以卡掉,所以这个情况再单独处理一下。极其难写。
CF1439B [* easy]
只考虑第二类问题存在简单的做法,每次将度数最小的删除,如果最小的为 (K) 甚至更大那么就 ok。
考虑第一类问题,不难发现如果不存在第二类的解但有第一类的解,则这个流程做了一段时间后必然会遇到某个点度数为 (K-1),此时团上的 (K) 个点确定,只能是这 (K) 个点,暴力 check 即可,复杂度 (mathcal O(frac{m}{K}cdot K^2))(检查使用哈希来加速)
不难发现 (Kle sqrt{m}),所以复杂度为 (mathcal O(msqrt{m}))
为啥卡常啊,屑死了,vector 转 int 妹妹行为。
CF1439C [* easy]
观察:每次跳 2 操作必然是连续的一段减去。
不难发现只会跳 (log w) 段,因为每次不跳意味着 (x'<a_i),且 (x>a_i) 所以 (x'<x/2)
暴力找节点即可,线段树模拟。
CF1439D [* medium]
先考虑 (n=m) 的情况,计算贡献和和方案数都是容易的,枚举最后一个人走到那里,两边都是满的子问题(也是 (n=m) 的情况)。
考虑 (n>m),枚举最后一段连续的 (1),那么又可以分成两个 sub problem。复杂度 (mathcal O(n^3))
CF1439E [* easy]
大杂烩。。
我们先证明这个图一定是树。
先给所有边定向,这样这张图至少是一个 DAG,我们证明每个点有且仅有一个父亲就 ok 了。
考虑 ((x,y)) 是 ok 的,那么只需要证明 ((x-1,y),(x,y-1)) 中恰好有一个是 ok 的,考虑 (x,y) 中二进制最低位较小的元素,我们必然直接减少其,同时一定 ok,不难发现给另一者 (-1) 显然是不 ok 的,
然后根据这类博弈论的套路,在树上翻硬币可以等价于每个硬币的 SG 的异或和。
观察一下,发现硬币的 SG 值似乎只和深度相关。
可以对深度归纳,不难证明深度为 (i) 的点的 SG 值为 (2^i)(深度从 0 开始标号)
于是后手赢等价于每个深度的点的数量都是偶数。
这样可以考虑假装存在一个序列,第 (i) 位为 (1) 表示这个深度有奇数个点,那么不难发现后手的一次操作等价于给前缀异或 (1)
于是操作次数实际上就是差分数组中 (1) 的数量。
最后,考虑初始加入链的过程,我们只需要维护他对这个假想的数列的贡献(注意他们只有染黑操作)于是只需要将计算 LCA,然后拆成若干条直上直下的链,一种做法是建立这些点的虚树,使用差分标记维护这个点到其父亲的边是否被染黑即可,这样只需要在差分数组中加入两个 pair 即可。
于是最后这个问题等价于在特殊树上求 (m) 对链的 LCA。
考虑直接模拟,我们发现我们暴力跳父亲复杂度很高,但是是可以加速的。如果某段操作全是给 (x) 减 (1) 那么是可以缩到一起的,实际上就是 (x) 的 low 小于 (y) 的 low 时可以连续跳 (2^{low(x)}) 次。
于是我们在 (mathcal O(mlog^2 w)) 的复杂度解决了这个问题。
代码的细节很多,我写了 3h.../ll(最后又双叒叕被卡了 vector 的常数,屑ctr爪巴)