天天看點

2015 Multi-University Training Contest 1 - 1009 Annoying problem Annoying problem Problem's Link:  http://acm.hdu.edu.cn/showproblem.php?pid=5296  

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: 

  

繼續閱讀