[學習筆記]線段樹分治
阿新 • • 發佈:2019-02-07
維護 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
[學習筆記]線段樹分治