CF842E Nikita and game
https://www.luogu.com.cn/problem/CF842E
考虑树的直径有性质:当存在多条直径,若长度为偶数,则它们交于一点,且为直径中点;若长度为奇数,则交于中间那条边。
于是记录下直径的中点(或中间那条边),同时对每个点维护到中点的距离
那么查询的时候,答案就是这个距离的最大值个数。
要是中间是边的情况,就对两个端点分别记录,拿最大值个数和次大值个数乘一乘大概就行。
或者你再把每条边变成一个虚点。
然后加叶子,对于加的这个叶子的父亲,看一下是不是当前的最大值或次大值,根据当前直径长度的奇偶性讨论,要移动到旁边的点/边上。
移动完信息的变更发现是先把某子树内的距离都减一,再把剩下部分都加一。
然后这个东西dfs+线段树就完了,离线下把整个树建好搞 dfs 序,每次加叶子变成激活一个节点,而未激活的节点不允许标记推上去