Mean:
給你一個有根樹和一個節點集合S,初始S為空,有q個操作,每個操作要麼從樹中選一個結點加入到S中(不删除樹中節點),要麼從S集合中删除一個結點。你需要從樹中選一些邊組成集合E,E中的邊能夠是S中的節點連通。對于每一個操作,輸出操作後E中所有邊的邊權之和。
analyse:
首先是構圖,把樹看作一個無向圖,使用鄰接表存圖。
處理出從1号結點的dfs序存儲起來。
添加點u操作:查找S集合中的點與添加的點dfs序在前面且編号最大的點,以及dfs序在後面且編号最小的點,設這兩個點是x,y。
那麼增加的花費是:dis[u]-dis[lca[(x,u)] - dis [lca(y,u)] + dis[lca(x,y) ]; 其中dis代表該點到根節點的距離。
對于删除點u操作:先把點從集合中删除,然後再計算減少花費,計算公式和增加的計算方法一樣。
也是看了題解才撸出來的。
Time complexity: O(N)
Source code: