LCT總結 應用篇(附題單)(LCT)

2022-03-19 20:48:57 字數 4305 閱讀 8789

為了優化體驗(其實是強迫症),蒟蒻把總結拆成了兩篇,方便不同學習階段的dalao們切換。

lct總結——概念篇戳這裡

灰常感謝xzy巨佬提供的強力資磁!(可參考xzy巨佬的部落格總結)

題單對於系統地學習乙個知識點還是有好處的。

所以蒟蒻蒐集了各處的lct題目(其實作為近年新興的知識點,現有的好題不是很多,有些題樹剖也可做)

大概按細化分類進行整理(模擬下面的幾個細化知識點,會有重複的列舉)

同一類中的題目也大概按難度遞增吧(太弱了,對每個題的難度定位或許有不准的地方,歡迎討論!)

思路與模板基本都很像了,就不展開討論了

洛谷p1501 [國家集訓隊]tree ii(點選進入題目)

感覺難度評定也高了點吧

有了鏈上乘法和鏈上加法,那肯定是像線段樹區間修改那樣使用懶標記了。

放標記的做法來自[模板]線段樹2

那裡發題解的dalao們都講得挺好的,本蒟蒻參考一下。

蒟蒻的題解在這裡

洛谷p3203 [hnoi2010]彈飛綿羊(點選進入題目)

略帶一點思維,但是**比模板還簡單。。。。。。

在lct模板基礎上進行靈活運用,可以使**和程式都做到高效。

蒟蒻的題解在這裡

洛谷p4332 [shoi2014]三叉神經樹

沒有那麼裸了,仔細分析並利用好題目的性質

蒟蒻的題解在這裡

維護連通性?findroot判一下就好啦!屬於模板範疇

至於雙連通分量,lct好像只能資磁加邊。。。。。。

lct中的每個點其實代表的是乙個雙連通分量,維護每個點屬於哪個雙連通分量需要在外面弄乙個並查集維護。

加邊時,如果兩點不連通就link;

如果連通就說明有環,把環縮成乙個點,在並查集裡也全部合併在一起

其中要注意很多細節,具體就看下下面例題2的**吧

洛谷p3950 部落衝突(點選進入題目)

正解不是lct。。。。。。

只是這裡用lct的思路非常簡單甚至於無腦。。。。。。

蒟蒻題解

洛谷p2542 [ahoi2005]航線規劃(點選進入題目)

基礎的動態維護雙連通分量,具體就看看題解吧

蒟蒻題解

普通lct維護點權,那對於邊權呢?比如要獲取一條路徑上最長的邊,等等。

這種維護的最經典的應用,大概就是動態維護一顆最小/大生成樹了(需要獲取邊長度等資訊)。

我起初有一種想法。

一棵樹,除了根節點,每個節點有且僅有一條父邊。

那麼如果我們只要邊的資訊,可不可以就把lct中的點的點權當成父邊的邊權呢?

在其它不少資料結構中好像是可以這樣做的。

只不過lct性質非常特殊。一旦換了根,原先邊的父子關係就破壞了。所以並不能這樣做。

那又如何是好呢?

我在網上看到有些部落格介紹的方法,是把邊置於lct外,然後在lct節點中維護父邊和重子邊的編號,需要更新資訊時從外部獲取,在access,link,cut時額外更改。

這樣好像挺麻煩的,要維護那麼多東西。

另一種更抽象的做法,也是我要分享的,就是兩個字——拆邊,把邊視作為乙個點,向該邊的兩個端點連兩條邊。

只需要維護邊權的時候,邊權存在lct中代表邊的點權裡,因為不需要維護真正的點權,所以lct中的代表點的點權可以設成空的(0),不會影響資訊的正確性。於是就變成了維護點權。

當然了,原先我們的link和cut是對於兩個點的,現在有點不一樣了(因為兩點之間又多了乙個代表邊的點)

update:發現之前描述的寫法有問題,且並不能優化多少常數,在這裡更正一下

寫法就是link/cut兩次,比如

link(e[i].id,e[i].x);link(e[i].id,e[i].y);

cut(e[i].id,e[i].x);cut(e[i].id,e[i].y);

洛谷p4180 [bjwc2010]次小生成樹

其實這道題用lct不是正解,不過是可做的(update:我後來又寫了lct),放在這裡一下吧。

用lct維護最小生成樹,再去列舉非樹邊嘗試替換樹邊,更新最優答案。

tply巨佬也用lct做的(某問題導致常數巨大?),他的題解在這裡

蒟蒻題解在這裡

洛谷p2387 [noi2014]魔法森林

我太弱啦!這種雙關鍵字的維護我是真的沒有思路,邊看著題解邊打出來的。orz xzy&xzz兩位巨佬,題解點讚!

不過作為lct維護邊權的好題目還是值得分享。

蒟蒻題解在這裡

有時候,我們需要的並不是維護鏈的資訊,而是子樹的資訊。要知道,lct是長於維護鏈的資訊,而弱於維護子樹資訊(這方面不得不承認樹剖的用處了,還要趕緊學)。然而動態的連邊和斷邊,又不得不要求我們使用lct來維護。

其實,我們還是不會束手無策的。

維護子樹資訊總和的一些常見題型,無非就是詢問整棵(原樹中的)子樹的總大小、權值總和、最值之類的東西。

我們已經可以通過輔助樹splay來獲知splay中的實子樹(也就是原樹中的一條鏈)的資訊總和。

既然原樹的邊只有實與虛,子樹也只有實與虛,那麼如果要想維護好原樹的資訊總和,我們是不是首先要知道虛子樹的資訊總和?

注:以下設虛子樹資訊總和用陣列si表示,原樹資訊總和用s表示。此處si[x]只包含x所有虛子樹(通過輕邊指向x)的資訊總和,而s[x]實際上是在lct中的所有兒子的資訊總和(包括輔助樹splay中相對的左右兒子的總和與被輕邊所指的絕對的虛子樹的總和)。

那麼如果我們確定了si[x]的值,是不是就知道了s[x]的值了?實加虛嘛!

這就是pushup,**

inline void pushup(int x)
先不對這種方法是怎樣來的這個問題追本溯源,那我們就可以直接考慮si如何維護了。

還是直接假設我們已經提前維護好了si吧。

很顯然,si的變化取決於虛實邊的變化,所以現在我們只考慮lct中的每個操作會對虛實邊產生怎樣的影響。

inline void access(int x)

}

//保證連邊合法

inline void link(int x,int y)

//不保證

inline bool link(int x,int y)

分析到此完畢。其實好像也就只改了一點點地方。。。。。。不過思路是很巧妙的,值得用心體會。

補充一句,如果要維護子樹裡的最值,乙個套路是在每個節點開乙個平衡樹維護該節點所有虛子樹的最值,以便進行查詢和更改。

洛谷p4219 [bjoi2014]大融合(點選進入題目)

當學會了lct維護子樹資訊和以後,這題就變得有些裸了。。。。。。

蒟蒻題解在這裡

洛谷u19482 山村遊歷(wander)(點選進入題目)

仔細讀一下題目吧,這道題水平挺高的。

思路分析:

也有點複雜

然而分析完了以後,又變成裸的了。。。。。。

算了,還是單獨建一篇隨筆吧。

蒟蒻題解在這裡

維護方法要視具體情況分析

可能可以開乙個lct然後把同色的點連起來,這樣做思路很簡單,但實現起來受侷限

也可能有多少顏色就開多少個lct,然後在對應顏色的lct中連上

公升級操作:修改點的顏色

需要轉化模型,可參考下面例題2

再次公升級操作:修改鏈為同一種顏色

link-cut-memphis(霧

看一下發明者memphis巨佬的部落格吧

以上兩種操作都是在zjoi2018交流課上聽到的orz

洛谷p3703 [sdoi2017]樹點塗色(點選進入題目)

維護連通塊並不麻煩,只是思維難度超大。。。。。。

不會樹剖,焉知非福?

蒟蒻的題解

洛谷sp16549 qtree6 - query on a tree vi(點選進入題目)

一直都把邊化為子節點,這次來把點化為父邊(霧

蒟蒻的題解

有一類題目是真的毒瘤,怪異到都幾乎認不出它的真面目

似乎並不能把它們歸為任何一類lct題型或者任何一種套路

只好仔細分析題目,發現題目本身的特殊性,再轉化為lct模型解決

然而我什麼都分析不出來啊qwq

洛谷p3613 睡覺困難症候群

洛谷p5354 [ynoi2017]由乃的oj

把起床困難綜合症——乙個按位貪心的題目,完美地套在了lct中

蒟蒻題解

洛谷p3348 [zjoi2016]大森林

新技能get:虛點

離線的轉移思路也極為巧妙

蒟蒻題解

洛谷p4338 [zjoi2018]歷史

zjoi唯一可做題tat

不來一些大力結論,根本做不下去。。。。。。

蒟蒻題解

LCT刷題總結

初探多項式之後,開始了資料結構之旅,可持久化資料結構的總結大概是咕了,在這裡只總結一些 lct 的我認為比較好的題 發現題中只有刪邊操作,而我們只會做加邊,所有考慮時光倒流 先在最後時刻作出最小生成樹,之後 lct 維護最大值不斷 link,cut 加邊刪邊更新答案即可 頹了 b 哥的題解,挺好的一...

單例模式總結篇

所謂類的單例設計模式,就是採取一定的方法保證在整個軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個取得其物件例項的方法。1 單例模式保證了系統記憶體中該類只存在乙個物件,節省了系統資源,對於一些需要頻繁建立銷毀的物件,使用單例模式可以提高系統效能。2 當想例項化乙個單例類的時候,必須要記...

單鏈表反轉總結篇

單鏈表的反轉是常見的面試題目。本文總結了2種方法。單鏈表node的資料結構定義如下 class listnode 把當前鍊錶的下乙個節點pcur插入到頭結點dummy的下乙個節點中,就地反轉。dummy 1 2 3 4 5的就地反轉過程 pcur是需要反轉的節點。prev連線下一次需要反轉的節點 反...