這題難的不是樹狀數組(其實樹狀數組很簡單),主要是映射到樹狀數組。對樹和圖還不熟啊,導致這題就是借了別人的思路,可以用鄰接表建樹,
然后dfs一次就可以算出對某個節點它的第一個下標(在樹狀數組中)和最后一個下標。
那個更改的時候就用這兩個下標就行了。
比如下面的樣例
1 2
2 5
1 3
2 4
那么dfs一次之后,就會得到如下坐標(1,5)(3,5)(2,2)(5,5)(4,4)(建圖不一樣的話,后面對應出來的坐標會不一樣,每一對表示樣例中的數的第一個
下標和最后一個下標),也就是說從1開始,那么第一個就是1,最后一個是5(這個5不是節點5,而是節點4,但是第5個被訪問,其實第幾個訪問沒關系的,
我們只是要一個區間而已,這個區間代表包含了這棵樹(或者子樹)),那么和它有關的就是[1,5],對于2這個點它在樹中是第3個訪問的(2個是節點3)
那么2的第一個下標就是3,在這個子樹中最后一個訪問的還是5,所以和它有關的區間就是[3,5].同理可以得到其他幾個點所對應的坐標,不過中間可能不
怎么好想,我是這么理解的,對每一個點找出影響它的所有點然后放在一個區間中,那么改變時就好辦了,而放在一個區間中,就可以用dfs了。
代碼如下(如果對圖理解的好的話,建議自己先寫)
CODE