「こんなきれいな星も、やっぱりここまで来てから、見れたのだと思うから。だから・・もっと遠くへ・・」

一道有意思的题

昨天做模拟赛碰到的一题,大致意思是,定义树的中心是那个使得其他点到这个点距离的和最小的点。一开始有一些点,要求支持新插入一条边和查询某个树的中心。规模的话朴素反正是过不了的。
当时考试时YY了一个多小时,终于YY出了做法。首先要观察到合并两棵树S1,S2(S1>S2)后,新的中心必然在原来两棵树的中心的路径上。进 一步YY一下朴素做法后可以发现,路径上的点作为中心的代价是单峰的。于是可以发现新的中心必然在那棵较大的树里面。然后考虑大树S1的原中心是P1,那 么考虑中心的DP方程P’=P+S1-size2可以发现,加入S2后转移方程变成了P’=P+S1-size2+S2,于是发现转移代价最多比原来 多了S2。而size每走一条边至少会减1,于是可以证明,最多走O(S2)条边,代价就会进入增加的阶段,又因为单峰性,所以新的中心距离S1的距离必 然不超过O(S2)。这样时间复杂度就有保证了。
然后问题转化成了:怎么快速找两点之间的路径的下一个点和动态维护size。前者可以先把最终的树求出来,然后倍增祖先。后者就相当于给定一棵树,要求支持插入一个节点和查询子树和。这个可以动态树。于是就O(nlg^2n)了
我因为不会动态树用了一些比较乱搞的2B替代做法,时间复杂度可能多了个n^0.5之类的。