1. 程式人生 > >[學習筆記]線段樹分治

[學習筆記]線段樹分治

維護 gcd 樹分治 聯通塊 bsp 插入 dfs lct 學習筆記

https://www.luogu.org/blog/Miracevin/shuo-ju-jie-gou

一種離線處理方法

可以處理“具體哪個修改對詢問有影響”、可以貢獻不獨立、可以支持插入刪除

技術分享圖片

例題 7
? 給出一張圖
? 對每個點求出強制這個點點度為 1 的最小生成樹的權值

? ?? ≤ 100000, ?? ≤ 300000

每個邊存在三段:[1,x-1],[x+1,y-1][y+1,n]

LCT維護最小生成樹

i的答案再加上和i相鄰的邊權最小值

例題 8
? 給一棵樹,邊有邊權
? 每次操作是刪除一條邊並加入一條邊,保證操作完還是樹
? 你需要維護有多少點對 ??, ?? 的路徑上所有數的最大公約數是 1
? ?? ≤ 100000, ???? ≤ 100000, ?? ≤ 30000

反演一下得到:

ans=∑miu(d)f(d)

f(d)表示路徑上的點都是d的倍數的點對的個數

也就是,所有是d的倍數的點構成的若幹個聯通塊,f(d)=∑szi*(szi-1)/2

考慮對每個邊出現的區間進行線段樹分治

然後dfs,用按秩合並並查集維護每個d的f(d),也就是維護好聯通塊∑szi*(szi-1)/2

每加入一個邊,枚舉這個邊兩邊的點的gcd的約數d,再對每個並查集進行維護。

棧序撤銷

(當然LCT也可以,常數爆炸就是了)

例題 9
? (CTSC2016)
? 你需要維護若幹個版本的集合,每個集合元素是 ??, ??
? 每次可以擴展一個版本,擴展內容為加一個新元素或刪除一個已
有元素
? 每次詢問一個 ??,要你在給定版本 ?? 的集合中找出 ??, ?? 使得
?? ? ?? 2 + ?? 最小
? ??, ?? ≤ 1000000

[學習筆記]線段樹分治