Sone0
DescriptionReference
有一顆n個節點的樹,每個節點有編號與權值。有m次操作,每種操作都有獨特的編號。
編號爲1的操作,會切斷當前樹上存在的一條邊,並新加一條邊,保證操作完成後仍然是樹。
編號爲2的操作,會改變這顆樹的根節點(初始根節點爲1)。
編號爲3的操作,會給樹上一條路徑上所有點的權值都增加x。
編號爲4的操作,會對樹上一條路徑上點的權值信息進行輪換:
如果是對 到 這條路徑操作,從 走到 的遍歷序列是 。
則 的權值改爲 的權值, 的權值改爲 的權值…… 的權值改爲 的權值, 的權值改爲 的權值。
編號爲5的操作,會對樹上一條路徑上所有點的權值都開方(下取整)
編號爲6的操作,會詢問樹上一條路徑上所有點的權值和。
編號爲7的操作,會給定兩個常數 和 。
你需要求出兩個正整數 和 ,對於給定路徑上任意兩點權值 和 ,需要滿足 。
如果無論如何都滿足不了這個條件,那麼需要滿足給定路徑上存在兩點權值 和 ,滿足 。
如果還是無論如何都不可能滿足,那麼該操作爲非法操作。
你需要求出 和 ,並最小化 。對於非法操作輸出 。
編號爲8的操作,會詢問樹中一個子樹的大小。
好SAO啊
Task1 暴力
Task2
Task3 開方是類似於分塊的做法,樹上連分塊都省了。暴力即可。
Task4 開方的時候 最大值等於最小值 或者最大值和最小值的差爲 就打標記,然後退出。
Task5 類歐
Task6 Splay
Task7 暴力鏈表 or LCT
Task8 樹剖
Task9 Euler-Tour-TreeReference是用一個 splay 維護歐拉遊覽序(實際上被省略成括號序列)的東西
茲磁子樹操作、鏈操作、Link&Cut、換根。
換根:access,左翻翻,右翻翻;到根路徑上點的子樹打標記,下次遇到就翻翻
emm 但是跟這道題沒有什麼關係。我只是看到就順便去翻了翻。
我們知道:沒有 Link&Cut 的情況下,就算有換根也能夠維護子樹大小。
方法:不真正地換根,知道根是哪個就可以。
Task10 LCT
Task11 把權值和形態用兩個 Splay 分別維護。
Task12 換根+Link&Cut 的情況下,維護子樹大小的套路是維護虛子樹信息Reference。
Access 的時候虛實切換。然後修一下, Pushup 即可。
Link(x,y) 的時候, y 的 Size 和 y 的祖先的 Size 都會變
方法很暴力,Link(x,y){ Makeroot(x), Makeroot(y), LINK(x,y), Pushup(y); }
(中間的 LINK(x,y) 就是指 Fa[x]=y, Siz[y]+=Siz[x] 之類的東西啦。)
如果沒寫過的話推薦一道例題 [BJOI2014] 大融合 (ps BJOI2014 的板子好多啊。。
Task13 開方怎麼做呢?……思路不變。把相同的段一起搞?
懶的寫就跟前面的一樣啦。
有根樹LCT
裸題啊 彈飛綿羊大家都寫過。。
需要注意的:Cut(u,Fa) 的時候把 Fa 轉上 Splay 頂再 Cut
Cut(u,Fa){ Access(u), Splay(Fa), CUT(u,Fa), Pushup(Fa); }
LCT維護圖上信息
樹連通性
不管用不用支持刪邊都是裸題。
BZOJ2049。
圖連通性,不支持刪邊Reference
剛好看到了就順便寫一下吧。
首先要想到一個套路啊 並茶几維護縮點。
並茶几一號 維護兩個點是否聯通
每次 Link 如果兩個點不是聯通的 就直接連
如果兩個點是聯通的
並茶几二號 維護兩個點是否雙聯通
沒有就連+縮點
有就縮點
圖連通性,支持刪邊
這東西就是動態圖(連通性),loj[1][2] 和 luogu 上面都有板子題。
離線
線段樹分治可以秒離線。
每條邊只在一段區間的時間內會存在
線段樹的每個節點維護一個 vector
維護覆蓋這個點的邊存在的時間的區間
於是用可撤銷並查集維護當前連通的點
在線
我看網上題解都是被插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插插
等哪天這個東西dssq+我要是沒退役再補吧