专栏文章

题解:CF2035F Tree Operations

CF2035F题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqdp7i6
此快照首次捕获于
2025/12/04 03:07
3 个月前
此快照最后确认于
2025/12/04 03:07
3 个月前
查看原文
可以说是官解的中文翻译了。
目标是使所有节点的权值变为 00
最重要的是想到,如果 mm 次操作可以达到目标,那么 2n+m2n + m 次操作也可行。
证明:在 mm 次操作的基础上先用 nn 次操作将所有节点变为 11,再用 nn 次操作把所有节点都变为 00
这说明 i[0,2n1],x{xxmod2n=i}\forall i \in [0, 2n - 1],x \in\{x|x \bmod 2n = i\}xx 次操作对达到目标具有单调性。(后面将证明总是有解的)。
容易得到做法:遍历 i[0,2n1]i\in[0,2n - 1],对集合 {xxmod2n=i}\{x|x \bmod 2n = i\} 二分最小的能达到目标的 xx(之后会证明二分的上下界,感性上来讲上界不会太大,上界到 1×10131\times10^{13} 次可过)。
对于二分的检查函数,可以通过 O(n)\mathcal{O}(n) 的树型 dp 来完成。
  • 假设当前的检查的操作数为 xxO(n)\mathcal{O}(n) 地计算所有节点的操作数,定义节点 uu 的操作数为 fuf_u
  • 定义使以 uu 为根节点的子树变为 00 的额外操作数为 huh_u。使以 uu 为根节点的子树变为 00 的总操作数为 need=vson(u)hv+aineed = \sum\limits_{v \in son(u)} h_v + a_i
  • needfuneed \ge f_uhu=needfuh_u = need - f_u。 - need<funeed \lt f_u,必然会有多余的操作,两次多余的操作间可以抵消,所以 hu=(funeed)mod2h_u = (f_u - need) \bmod 2。 - 检查 huh_u 是否等于 00,等于 00 说明操作次数为 xx 可行。
时间复杂度为 O(n2logV)\mathcal{O}(n^2\log V)VV 为二分上界。代码
本题可以通过确定二分上下界优化成 O(nlognai+n2logn)\mathcal{O}(n\log na_i+n^2\log n)。同时能证明总是有解。
先解决一个更为简单的问题。使树上所有节点的权值不大于 00 的最小操作数。与上述树形 dp 的流程大致相同,只是当 need<funeed \lt f_u 时令 hu=0h_u = 0
可以二分出一个下界 tt。同时对于原问题,tt 次操作后可以令原树的节点的权值全部变为 0011,原问题的下界肯定不小于 tt,这很显然。且上界不大于 t+n2+2n+1t + n^2 + 2n + 1。接下来仅考虑最坏情况。考虑将所有节点的权值变为同一个数。
  • 定义所有节点的权值和的奇偶性为树的奇偶性。每 nn 次操作可以令整棵树的节点翻转。如果每 nn 次操作,除了根节点 RR 以外的节点全部翻转,那么会多出一次操作能用来使另一个节点保持原状,从而改变奇偶性,从而可以接近所有节点权值相同的情况。那么,此处最多为大致 n2n^2 次操作。
  • 而如果此时 RR 与其他值都不同。可以通过最差 n+1n + 1 次操作改变:不改变 RR,改变一个节点 22 次。如果全部是 11,再通过 nn 次操作变为 00
确定上下界后和原来一样二分就好。
二分区间长为 (n+1)2(n + 1)^2,找出 tt 的时间复杂度为 O(nlog(nmaxi=1n(ai)))\mathcal{O}(n\log (n\max\limits_{i = 1}^{n}(a_i))),最后二分的时间复杂度为 O(nlogn2)\mathcal{O}(n\log n^2)。总复杂度为 O(nlog(nai)+nlogn)\mathcal{O}(n\log (na_i) + n\log n)代码

评论

0 条评论,欢迎与作者交流。

正在加载评论...