题意
九条可怜是一个热爱阅读的女孩子。
这段时间,她看了一本非常有趣的小说,这本小说的架空世界引起了她的兴趣。
这个世界有 n n n 个城市,这 n n n 个城市被恰好 n − 1 n − 1 n−1 条双向道路联通,即任意两个城市都可以互相到达。同时城市 1 1 1 坐落在世界的中心,占领了这个城市就称霸了这个世界。
在最开始,这 n n n 个城市都不在任何国家的控制之下,但是随着社会的发展,一些城市会崛起形成国家并夺取世界的霸权。为了方便,我们标记第 i i i 个城市崛起产生的国家为第 i i i 个国家。
在第 i i i 个城市崛起的过程中,第 i i i 个国家会取得城市 i i i 到城市 1 1 1 路径上所有城市的控制权。新的城市的崛起往往意味着战争与死亡,若第 i i i 个国家在崛起中,需要取得一个原本被国家 j ( j ≠ i ) j(j \ne i) j(j=i) 控制的城市的控制权,那么国家 i i i 就必须向国家 j j j 宣战并进行战争。
现在,可怜知道了,在历史上,第 i i i 个城市一共崛起了 a i a_i ai 次。但是这些事件发生的相对顺序已经无从考究了,唯一的信息是,在一个城市崛起称霸世界之前,新的城市是不会崛起的。
战争对人民来说是灾难性的。可怜定义一次崛起的灾难度为崛起的过程中会和多少不同的国家进行战争(和同一个国家进行多次战争只会被计入一次)。可怜想要知道,在所有可能的崛起顺序中,灾难度之和最大是多少。
同时,在考古学家的努力下,越来越多的历史资料被发掘了出来,根据这些新的资料,可
怜会对
a
i
a_i
ai 进行一些修正。具体来说,可怜会对
a
i
a_i
ai 进行一些操作,每次会将
a
x
a_x
ax 加上
w
w
w。她希望
在每次修改之后,都能计算得到最大的灾难度。
然而可怜对复杂的计算并不感兴趣,因此她想让你来帮她计算一下这些数值。
对题面的一些补充:
- 同一个城市多次崛起形成的国家是同一个国家,这意味着同一个城市连续崛起两次是不会和任何国家开战的:因为这些城市原来就在它的控制之下。
- 在历史的演变过程中,第 i i i 个国家可能会有一段时间没有任何城市的控制权。但是这并不意味着第 i i i 个国家灭亡了,在城市 i i i 崛起的时候,第 i i i 个国家仍然会取得 1 1 1 到 i i i 路径上的城市的控制权。
范围
测试点 | n n n | m m m | 其他约定 |
---|---|---|---|
1 | ≤ 10 \le 10 ≤10 | = 0 =0 =0 | a i = 1 a_i=1 ai=1 |
2-3 | ≤ 150000 \le 150000 ≤150000 | ≤ 150000 \le 150000 ≤150000 | 第 i i i 条道路连接 i i i 和 i + 1 i + 1 i+1 |
4-5 | ≤ 150000 \le 150000 ≤150000 | = 0 =0 =0 | - |
6-8 | ≤ 150000 \le 150000 ≤150000 | ≤ 150000 \le 150000 ≤150000 | - |
9-10 | ≤ 4 × 1 0 5 \le 4 \times 10^5 ≤4×105 | ≤ 4 × 1 0 5 \le 4\times 10^5 ≤4×105 | - |
题解:
先考虑不修改怎么做:如果每次考虑一条路径的贡献,则难以用正确的贪心策略解决和计算;不妨换个角度,考虑每个点的贡献:一个点造成贡献当且仅当这个点是相邻发生战争的两个城市的lca,要使这个点上尽可能多地发生战争,就要使每次经过这个点的城市造成贡献,即连续两个点在不同子树内(这个点和这个点的子树算不同子树),于是转化为一个经典显然的问题:若有一个子树大小过半,则只能使其它子树之间穿插这个子树,否则相邻的都可以产生贡献,于是树形DP即可。
考虑对于一个点增加,只会影响它到根的路径上,是否有子树过半的情况发生变化的那些点的DP值,设s为子树a的和,则每经过这样的点,子树的s至少倍增,所以点数是log级别的。考虑如何快速找到这些点,发现如果一个子树本来就过半,那么加完后依然过半,既然过半这个条件这么特殊,就把每个点连向过半的子树的边标为重边,这样每个点就向上找到第一个轻边更新,这显然用lct维护即可。