P3258 [JLOI2014]松鼠的新家(树上点查分)
題目描述
松鼠的新家是一棵樹,前幾天剛剛裝修了新家,新家有n個房間,并且有n-1根樹枝連接,每個房間都可以相互到達,且倆個房間之間的路線都是唯一的。天哪,他居然真的住在”樹“上。
松鼠想邀請小熊維尼前來參觀,并且還指定一份參觀指南,他希望維尼能夠按照他的指南順序,先去a1,再去a2,…,最后到an,去參觀新家。可是這樣會導(dǎo)致維尼重復(fù)走很多房間,懶惰的維尼不停地推辭。可是松鼠告訴他,每走到一個房間,他就可以從房間拿一塊糖果吃。
維尼是個饞家伙,立馬就答應(yīng)了。現(xiàn)在松鼠希望知道為了保證維尼有糖果吃,他需要在每一個房間各放至少多少個糖果。
因為松鼠參觀指南上的最后一個房間an是餐廳,餐廳里他準(zhǔn)備了豐盛的大餐,所以當(dāng)維尼在參觀的最后到達餐廳時就不需要再拿糖果吃了。
輸入格式
第一行一個整數(shù)n,表示房間個數(shù)第二行n個整數(shù),依次描述a1-an
接下來n-1行,每行兩個整數(shù)x,y,表示標(biāo)號x和y的兩個房間之間有樹枝相連。
輸出格式
一共n行,第i行輸出標(biāo)號為i的房間至少需要放多少個糖果,才能讓維尼有糖果吃。
輸入輸出樣例
輸入 #1 復(fù)制
5
1 4 5 3 2
1 2
2 4
2 3
4 5
輸出 #1 復(fù)制
1
2
1
2
1
說明/提示
2<= n <=300000
關(guān)于點的差分(如將路徑上的所有點權(quán)值加一,求最后點的權(quán)值)
此操作中我們這樣維護:每次經(jīng)過一條邊,(如從u到v)我們讓tmp[u]++,tmp[v]++,tmp[LCA(u,v)]–,tmp[grand[LCA(u,v)][0]]–。(最后要把tmp推上去)
以一次添加為例想象一下,首先u到根的路徑上tmp都+1,此時u到根間結(jié)點tmp都為1,之后v到根路徑上tmp+1,此時u到LCA前一個,v到LCA前一個點的tmp都+1,而LCA到根的所有點都+2,然后從tmp[LCA]–,更新上去,此時u-v路上所有tmp都+1,已經(jīng)達到目的。
而多余的是什么部分呢,也就是LCA的上一個結(jié)點(grand[LCA][0])到根的這一段都多加了1,所以tmp[grand[LCA][0]]–,更新上去,也就完成了。
實際操作時也不需要每次更新都推上去,只要把四個tmp維護好,最后Dfs走一邊就更新完了。
松鼠的新家是樹上點差分模板題,代碼如下:
努力加油a啊,(o)/~
總結(jié)
以上是生活随笔為你收集整理的P3258 [JLOI2014]松鼠的新家(树上点查分)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Distance on the tree
- 下一篇: P2680 运输计划(树上差分+lca+