T1:首先有一个结论:每次肯定都是把权值最大的点周围还没有删的边都删掉,这个很好证。
然后可以把删边变成加边,接着用并查集维护;同时也可以直接用公式:ans=sum(a[i])-max(a[i])+sum(a[x[i]],a[y[i]])。这条公式的意义是除了最大值点之外的每一个点都会在作为某个最大值点被删之后某棵子树的最大值计算一次,这就是sum(a[i])-max(a[i]),而每次删去一条边还会计算一次这条边连接的两个点中权值较大的一个,这就是sum(a[x[i]],a[y[i]])。
比赛时想到了第一条性质,但是没想到接下来怎样处理。
T2:n^2的做法很好想,就是分类讨论删的两条边是否具有祖孙关系。
接着在n^2的基础上优化。我们dfs一遍整棵树,每次进一个点时把它的siz[x]加入线段树f1,出来时把它的siz[x]从f1中删去,再把它加入线段树f2。这样我们就维护除了和它有祖孙关系的集合(f1)以及和它没有祖孙关系的集合(f2)。
在统计答案时,我们每次强制siz[x]要选,然后剩下的两个siz肯定是越接近越优的,所以我们可以算出另一个siz[y]要尽量接近的值,在线段树上二分就可以了。