题解:CF2035F Tree Operations
更不好的阅读体验!
可以说是官解的中文翻译了。
目标是使所有节点的权值变为
最重要的是想到,如果
证明:在
这说明
容易得到做法:遍历
对于二分的检查函数,可以通过
- 假设当前的检查的操作数为
x 。\mathcal{O}(n) 地计算所有节点的操作数,定义节点u 的操作数为f_u 。 - 定义使以
u 为根节点的子树变为0 的额外操作数为h_u 。使以u 为根节点的子树变为0 的总操作数为need = \sum\limits_{v \in son(u)} h_v + a_i 。 -
- $need \lt f_u$,必然会有多余的操作,两次多余的操作间可以抵消,所以 $h_u = (f_u - need) \bmod 2$。 - 检查 $h_u$ 是否等于 $0$,等于 $0$ 说明操作次数为 $x$ 可行。
时间复杂度为
本题可以通过确定二分上下界优化成
先解决一个更为简单的问题。使树上所有节点的权值不大于
可以二分出一个下界
- 定义所有节点的权值和的奇偶性为树的奇偶性。每
n 次操作可以令整棵树的节点翻转。如果每n 次操作,除了根节点R 以外的节点全部翻转,那么会多出一次操作能用来使另一个节点保持原状,从而改变奇偶性,从而可以接近所有节点权值相同的情况。那么,此处最多为大致n^2 次操作。 - 而如果此时
R 与其他值都不同。可以通过最差n + 1 次操作改变:不改变R ,改变一个节点2 次。如果全部是1 ,再通过n 次操作变为0 。
确定上下界后和原来一样二分就好。
二分区间长为