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