我定睛一看,上一篇博客居然是去年省选写的。。。emmm我果然很懒。。

又是一年省选季,临死前订正一下去年的题吧。。

作为第一天30pts的滚粗选手,我去年并没有怎么思考这题。。

 

题意概括好麻烦,来来来我们放题目链接。。

 

为了方便叙述,我们用Ti表示 ∑(i在lca的子树中)ai

 

从无修改的情况的入手。我们先解决一个问题,即:如果给出一个崛起的顺序,比如样例中的4,1,5,3,2,我们要怎么计算灾难度之和。

 

考虑顺序为:......u.....v..... 则u,v贡献一个灾难度的条件为:u....v之间没有点在lca(u,v)的子树中。比如例子中4,1,5中的4,5贡献了一个灾难度,是因为1不在lca(4,5)=2的子树中。可以发现,如一个u,v能通过lca贡献一个灾难度,那么u,v仅有两种情况:1.u,v为lca不同儿子的后代 2.u,v中某点为lca,另一点为lca的后代。

 

考虑u,v十分地累。。。所以考虑每个lca,由 u,v贡献灾难度的条件 我们发现,要计算通过lca贡献1的点对个数,只需关心lca子树中各点(共 ∑(i在lca的子树中)ai 个点)的相对位置。假设我们已知这个相对位置,现在要计算哪些点可以通过lca贡献一个灾难度。由情况1,2我们知道,lca的每个儿子的子树中的点是等价的。令lca的儿子个数为s,则,我们可以将lca子树中的所有点看成一些染了色的点(共s+1种颜色,每个儿子子树一种+lca一种)。

 

现在,对于每个lca,我们得到了(s+1)中颜色的点的排列。那么,通过lca贡献的1的点对个数 等价于这个排列上 相邻且不同色的点对u,v 的个数。(Q:为什么一定要相邻?A:如果不相邻,那么u,v之间出现的点一定会把u和v的所有公共路径覆盖掉,此时两点无法贡献答案。)

 

好,现在我们已经得到了一种已知崛起顺序的计算方法,我们来考虑让灾难度之和最大。容(mei)易(you)发现,上述计算方法有一个很不错的性质,即不管每个lca子树里怎么安排它的颜色序列,这些颜色序列都能组成整个方案。并且,每个序列可以直接对答案有独立贡献。这就很棒,不带修改的情况直接转换为一个相对简单的问题:

有c种颜色的点,颜色为i的点有Ti个。求出所有点的排列中 相邻异色点对个数 的最大值。

这个最大值的上界显然是 Ti-1 。我们考虑构造一种排列。现在我们有  Ti个空格子。我们将{ai}从大到小排序。先取出a1个颜色为1的点来填。为尽量不浪费,我们隔一格填1个1。填完之后,我们把填好的格子看作被删掉,有了一条的连续空格子,于是我们可以取出a2个颜色为2的点,重复上述过程。(举个🌰:数组a为3,2,2,1,1 那么这样填 101010000 -> 121012000 -> 121312030-> 121312430-> 121312435)这样就结案了!我们发现,如果1轮之后a1没有用完,那么势必会出现同色点相邻的情况,达不到上界。也就是说,如果存在 Ti+1≤2*ai,那么答案一定达不到Ti-1。并且此时,再填入其他颜色,不会新增浪费。

综上,令mx=max{ai},答案即为min( Ti-1 , 2*( Ti-mx ) )

于是,在无修改情况下,我们可以O(n)求出答案!

 

我们考虑单点修改对答案的影响。

显然,修改点u只会影响 u点及其祖先 的子树。考虑被其中一点f增加w对其父亲F的影响。这个影响有以下情况:

1. 2*Tf≥TF+1,这时Tf仍是最大的儿子,我们只需找个数据结构对这样的边f-F区间减2w即可。

2. 2*Tf≤TF。这提供了一个性质,即连续的这样的边f-F最多log条。

进一步思考这个性质在1-u这条链上的表现,2*Tf≥TF+1时,F->f后至少有Tf≤TF,可视作 TF至多不变,可能减少 。2*Tf≤TF时,视作TF至多减半,可能减更多。因此,满足 2*Tf≤TF的边在(1-u)链上最多log条。这样我们就可以暴力修改这样的边了= =。

 

维护的话,用树剖是nlog2的,一股浓浓的“你若敢交我就敢卡,你要能过我也没法”的气息。。。所以我们还是乖乖lct吧。。。