一些$LCT$的瓜皮題目

一些瓜皮

放幾個比較優(she)秀(pi)\(LCT\)題。
老慣例,每一題代碼由於一些未知緣由消失了(若是要的話私我好了,雖然會咕咕咕)。
嘴巴\(AC\)真香!算法

[SP16580] QTREE7

對黑色、白色各開一棵有根\(LCT\)
\(x\)點加入顏色\(c\)集合,則在\(c\)的那顆\(LCT\)上鍊接\((x,fa_x)\),在另外一棵上斷掉父親邊。
查詢時,首先判斷根結點是否在當前顏色集合內。
若是在的話直接查整棵\(LCT\)
不然走向右兒子,查詢對應子樹。
什麼子樹最大值啥的維護一會兒樹信息,拿\(multiset\)搞搞就好了。spa

[BZOJ2959] 長跑

動態聯通圖?這種東西估計只有鴿子他們纔會吧......
注意到邊是任意定向,因此一個環等價於都能走,直接縮起來便可。
因此若是當前連邊兩點已經在一個聯通塊了,那麼直接暴力縮點。資源

[LOJ6041] 事情的類似度

\(SAM\),那麼兩個結點的\(LCA\)就是它們的最大\(lcp\)
離線,依次加入左端點,那麼它沿着\(SAM\)\(fail\)樹一路往上爬,遇到的全部右端點都有貢獻。
這是\(LCT\)的經典應用,就是一個\(Access\)
而且顯然只有最靠左的右端點有用,因此\(LCT\)維護最小右端點便可。
最後獲得了若干二元組,掃描線一遍完事。qt

[ZJOI2018] 歷史

顯然每一個結點的答案只與/子樹內戰爭個數\(sum\)/和//最大戰爭個數的子樹/的戰爭個數\(mx\)//有關。
\(mx > \lceil \frac{sum}{2} \rceil\)時,\(Ans = 2(sum-mx)\),不然\(Ans = sum-1\)
一個直觀想法就出來了,直接有根\(LCT\)維護子樹最大值,每次\(Access\)更新答案。
吉老師:\(naive\)
問題在於:每次\(PushUp\)須要知道子樹大小,而知道子樹大小須要\(Splay\)當前結點。
因此這題就變仙了。
直接相似\(LCT\)維護狀態,對於知足\(mx> \lceil \frac{sum}{2} \rceil\)的兒子用重鏈鏈接,不然用輕鏈鏈接。
能夠發現一條重要性質:爆跳父親,重鏈個數不會超過\(log_2(deep)\)
而後真相大白,所有暴力維護便可。io

[BZOJ2888] 資源運輸

維護重心是一個老的不行的套路了,使用啓發式合併能夠秒殺。
問題在於維護全部點到重心的距離和。
點分治?作夢吧你!
能夠發現,對每個點維護聯通塊內的點到其的距離和至關浪費。
其實咱們只須要知道重心的該信息。
因此就只在重心維護這個信息,考慮重心移動時的轉移,發現只須要再維護子樹和就好了。
因爲咱們須要支持\(Link\)操做的同時維護子樹信息,因此依舊須要維護換根反轉標記。class

[BZOJ3779] 重組病毒

顯然染色操做就至關於\(Access\),而後考慮貢獻。
咱們把減小量差分處理,那麼對於重鏈鏈頂的子樹,答案所有減小了\(1\)
同時對於原來的重鏈兒子,其顏色會相對來講增長\(1\)
把原樹給剖一下而後線段樹區間修改直接維護便可。
如今有了換根操做,實際上是同樣的。
能夠發現,換根後進行一次染色,等價於先染色而後換根(反正那條鏈的顏色只有一個)。
因此就看成什麼都沒發生,直接換根。
因爲如今根能夠在查詢點的子樹內,因此這種狀況加貢獻也要特殊處理,稍微弄一下就好了。秒殺

[BZOJ4573] 大森林

\(n\)\(LCT\)是不可能的,這輩子都不可能的。
因爲詢問保證查詢點必定在樹上,因此把那些多餘的點所有建出來是沒有影響的。
因此惟一難辦的操做就是更換生長結點了,此時須要集體換父親操做。
不難想到,對於第\(i\)個生長結點,創建一個虛擬結點\(p_i\),把長在它下面的結點所有連在\(p_i\)上。
如今能夠解決集體換父親了,但如何放置這些虛擬結點使其知足對應包含關係?
咱們使用一種近乎瘋狂的方式解決這個問題。
離線。
在算法開始前,咱們把\(p_i\)鏈接到\(p_{i-1}\)下面。
那麼當碰到更換生長結點操做\(i\)的左端點時,直接把\(p_i\)鏈接到對應位置。
在該操做結束後,把\(p_i\)從新鏈接回\(p_{i-1}\)下面。
包含關係顯然時刻都是對的。
而後查詢答案涉及求\(LCA\)(可能爲虛點),很棒的是\(LCT\)完美茲瓷該操做。查詢

相關文章
相關標籤/搜索