樹鏈剖分
….等等等等
這是題目總結,反正就是把各種水題放到一起。
然後數組意義的話,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的查詢值。這樣的話可以把詢問先離線排序,之後樹鏈剖分維護,在標記一下就可以了。