CF708C题解

挺简单的一道数据结构。。。

首先考虑这个“改造”的本质,很明显是把一颗子树塞到了另一个节点下面。

考虑一个节点可能成为重心的条件。条件很明显是只有一颗子树的大小大于 n2,否则一定不行。

考虑将这个子树的一个子树塞到我的别的子树中去。假设最大的子树大小是 x,最小的子树大小是 y,那么必须要找到 x 的一颗子树 s 满足 xsiz[s]n2&y+siz[s]n2

问题转化为询问 x 是否有一个子树满足 xn2siz[s]y+n2,这个问题可以由树套树来解决。

另一个操作就是在换根时,维护子树对应的大小。注意到换根只会对应到一条边,只会改变这两个节点的 siz 值,所以直接维护就好了。

复杂度是 O(nlog2n),但是有没有更简单的方法?

考虑到一个节点的 siz 只有 siznsiz 两种,并且一个节点的子树大小为 nsiz 时只有可能在 u1 的路径上,考虑直接询问 dfn 序上区间的权值在给定权值区间中数的数量,最后减去这一段。

至于这一段,在换根的时候可以开一颗权值树来询问。

离线下来做这个相当于二维前缀和,使用树状数组可以轻松做到 O(nlogn) 小常数。

本文作者:Prean

本文链接:https://www.cnblogs.com/lmpp/p/15842432.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Prean  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
var canShowAdsense=function(){return !!0};
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起