CF842E Nikita and game

https://www.luogu.com.cn/problem/CF842E

考虑树的直径有性质:当存在多条直径,若长度为偶数,则它们交于一点,且为直径中点;若长度为奇数,则交于中间那条边。

于是记录下直径的中点(或中间那条边),同时对每个点维护到中点的距离
那么查询的时候,答案就是这个距离的最大值个数。
要是中间是边的情况,就对两个端点分别记录,拿最大值个数和次大值个数乘一乘大概就行。
或者你再把每条边变成一个虚点。

然后加叶子,对于加的这个叶子的父亲,看一下是不是当前的最大值或次大值,根据当前直径长度的奇偶性讨论,要移动到旁边的点/边上。
移动完信息的变更发现是先把某子树内的距离都减一,再把剩下部分都加一。

然后这个东西dfs+线段树就完了,离线下把整个树建好搞 dfs 序,每次加叶子变成激活一个节点,而未激活的节点不允许标记推上去

上一篇:A multiplication game(易懂博弈)


下一篇:mysql导入导出.sql文件