首先,问题等价于求黑色和白色的直径。
我们维护每一个点变黑的时刻(等价于链 checkmin,可以用树剖加线段树解决,倒着做就是链覆盖),那么问题就等价于加点动态维护直径。
我们有性质:有点集 AAA 与 BBB,设其直径分别为 (a,b)(a,b)(a,b) 和 (c,d)(c,d)(c,d),则其合并后的直径 (s,t)(s,t)(s,t) 满足 s,t∈{a,b,c,d}s,t \in \{a,b,c,d\}s,t∈{a,b,c,d}。
我们只要判六次距离就能合并两个点集的直径,考虑每一次加边等价于连接连通块,用并查集维护一下即可。
白色的怎么办呢?时光倒流,等价于白色动态加点,再做一遍就好了。
注册一个 CZOJ 通用账户,您就可以在我们提供的所有在线评测服务上提交代码、参与讨论。
使用您的 CZOJ 通用账户