CF2042 E

题意:有一个 \(2n\) 个点的树,权值在 \(1\)\(n\) 之间且每个数均出现两次,一个点 \(i\) 的价值为 \(2^i\),求价值和最小的 \(1\)\(n\) 均出现过的连通块。

首先先二分出连通块中编号最大的点的最小值,再以这个点为根,接着再倒着考虑这个点是否要加入连通块。

对于根在的连通块,若枚举到 \(i\) 不加入连通块,那其子树中的点都不会在存在于连通块中,暴力修改即可,所以瓶颈在于判断是否可以不加入,而这个是简单的,若权值 \(x\) 在连通块中仍有两个,那么就不能删所以它们的公共祖先,若只有一个,那就不能删它和它的祖先,然后这个用一个树状数组维护下子树和就行了。

posted @ 2024-12-03 21:18  ~Cyan~  阅读(7)  评论(0编辑  收藏  举报