樹鏈剖分總結

樹鏈剖分

….等等等等
這是題目總結,反正就是把各種水題放到一起。

然後數組意義的話,dpt深度,son重兒子,ftr父親,rnk線段樹中編號,size是子樹大小,top是重鏈頂端的結點。


【Bzoj1036】樹的統計

比較裸,維護區間和與最大值就好了。


【Bzoj4034】樹上操作

也是模板,對於子樹只要記一個end[x]就行了。


【Bzoj4396】軟件包管理器

安裝操作就是將軟件包到根全都賦爲1,然後輸出改變的結點數量。刪除操作就是將以軟件包爲根的子樹全部賦爲0,並輸出修改數量。


【Bzoj2243】染色

注意合併的時候判斷接口的顏色,Get的時候也是一樣,如果接口顏色一樣統計時就要減去1。


【Bzoj2819】Nim

維護區間異或和,把+改爲^就好了。Nim的必勝策略是當所有堆石子異或和不爲0。


【Bzoj3083】遙遠的國度

要考慮一下那個換根的操作,當然不能真的換,要分幾種情況討論。
1.root == x ,詢問整棵樹,直接輸出全集。
2.root不爲x的子樹,則直接考慮x的整棵子樹。
3.root爲x的子樹(也可能是x的某子樹中的結點),則不能考慮x的這棵子樹,就直接抹去這一段考慮其補集


【Bzoj3531】旅行

對於每種顏色,放入不同的線段樹,但其實整個加起來還是還是n個結點,值得注意的是,這裏要使用動態開點,要一步步記錄左右兒子的編號,而不能使用2i,2i+1直接去找,而這樣建樹的話,就可以很方便的查詢同顏色的結點了,修改操作啥的把原顏色中的結點改爲0,再在現在的顏色中開點就可以了。


【Bzoj3626】LCA

首先發現一個性質,加上depth[LCA(l,r)]可以等價於將根到l加上1,之後查詢根到r。擴展到區間的話,設要求結點爲z,區間[l,r]。也就是從1加到r後對z的查詢值減去1加到l-1對z的查詢值。這樣的話可以把詢問先離線排序,之後樹鏈剖分維護,在標記一下就可以了。


發佈了72 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章