CSU 1811 Tree Intersection(線段樹+啟發式合併 解法)
阿新 • • 發佈:2019-02-07
Problem
Reference
Meaning
一棵 n 個結點的樹,每個結點都有一種顏色,問對與樹上的每條邊,刪掉它之後得到的兩棵樹中,共有的顏色有多少種(在那兩棵樹中都有的顏色就是公有的顏色)
Analysis
首先規定 1 號結點為整棵樹的根(其它號也可以)。
對與每一條邊,就看成是某個結點於它的父結點的連邊,於是,刪掉這條邊後兩個連同塊的共有顏色數,就等價於以這個結點為根的子樹裡共有顏色數(只有兩個連通塊,其中一個連通塊的“公共顏色”即是兩個連同塊的公共顏色)。
公共顏色是什麼呢?假如在其中一個連通塊中有 2 個綠色結點,而原樹一共有 4 個結點是綠色的,那綠色就是這兩個連通塊的公共顏色之一;反之,這個連通塊有一個黑色結點,而原樹也總共只有一個黑色結點,那黑色就是這個連通塊“私有”的顏色。
怎麼統計一棵子樹裡的共有顏色數呢?可以用線段樹。先不考慮空間,對每個結點都建一棵線段樹,記錄共有顏色數,然後將所有子結點的樹合併到父結點的樹裡,就得到了父結點的答案。但這麼做空間太大。
但其實對每個結點都沒必要真的建一整棵樹,因為根結點只有一種顏色,只需要一條鏈,而子樹的資訊,可以重用子樹建出來的結點,這樣就可以開得下。
具體看程式碼理解吧,線段樹新姿勢啊。
PS:我自己再補充一下吧,感覺這個建樹和結構已經與主席樹非常的像了。