CF2042 E

~Cyan~發表於2024-12-03

題意:有一個 \(2n\) 個點的樹,權值在 \(1\)\(n\) 之間且每個數均出現兩次,一個點 \(i\) 的價值為 \(2^i\),求價值和最小的 \(1\)\(n\) 均出現過的連通塊。

首先先二分出連通塊中編號最大的點的最小值,再以這個點為根,接著再倒著考慮這個點是否要加入連通塊。

對於根在的連通塊,若列舉到 \(i\) 不加入連通塊,那其子樹中的點都不會在存在於連通塊中,暴力修改即可,所以瓶頸在於判斷是否可以不加入,而這個是簡單的,若權值 \(x\) 在連通塊中仍有兩個,那麼就不能刪所以它們的公共祖先,若只有一個,那就不能刪它和它的祖先,然後這個用一個樹狀陣列維護下子樹和就行了。