題目大意:
一棵n
nn個點的樹上,查詢a
aa ~ b
bb,c
cc ~ d
dd兩段路徑公共的點的個數。
解題思路:
讀完題就感覺是樹鏈剖分的裸題呀…
把每個點的值初始化為0
00,對於每次詢問,把a
aa ~ b
bb這條路徑的值+1+1
+1,查詢c
cc ~ d
dd的區間和,再把a
aa ~ b
bb這條路徑的值−1-1
−1改回來。c
cc ~ d
dd的區間和就是交點數量。
**:(就是樹鏈剖分維護點權的板子,改了下main就過了…)
#include #include #include using namespace std;
const int maxn = 100000+10;
int w[maxn];
int n, q;
struct
e[maxn<<1];
int head[maxn],edgenum;
void add(int u,int v)
/*-------------------------樹剖------------------------------*/
int deep[maxn],fa[maxn],siz[maxn],son[maxn];
void dfs1(int u,int pre,int d)
}}int top[maxn],id[maxn],rk[maxn],cnt;
int &n = cnt;
void dfs2(int u,int t)
}/*-------------------------樹剖------------------------------*/
/*-------------------------線段樹------------------------------*/
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int sum[maxn<<2],lazy[maxn<<2];
void pushup(int rt)
void build(int l,int r,int rt)
int m = l+r>>1;
build(lson);
build(rson);
pushup(rt);
}void pushdown(int rt,int l,int r)
}void update(int l,int r,int val,int l,int r,int rt)
int m = l + r >> 1;
pushdown(rt,m-l+1,r-m);
if(l<=m)
update(l,r,val,lson);
if(r>m)
update(l,r,val,rson);
pushup(rt);
}int query(int l,int r,int l,int r,int rt)
/*-------------------------線段樹------------------------------*/
/*-----------------------樹剖加線段樹--------------------------*/
void update(int x,int y,int z)
int query(int x,int y)
if(deep[x]>deep[y])
swap(x,y);
ans = (ans + query(id[x],id[y],1,n,1));
return ans;
}/*-----------------------樹剖加線段樹--------------------------*/
void init()
int u, v, x1, y1, x2, y2;
int main()
dfs1(1,0,0);
dfs2(1,1);
build(1,n,1);
while(q--)
return 0;
}
樹鏈剖分 樹鏈剖分講解
好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 vector v maxn int size maxn dep maxn val maxn id maxn hson maxn top maxn fa maxn 定義 int edge 1,num 1 struct tree e ma...
gym 102059A 樹鏈剖分後odt維護區間
題意 一棵樹多次修改,每次修改乙個點到根的所有邊的顏色,並詢問現在有哪些顏色染了恰好 m 條邊 題解 稍加思考可以知道,從某個點到根節點的顏色數,均攤複雜度很低,因此,可以考慮珂朵莉樹維護重鏈剖分 這裡也記錄一下珂朵莉樹的 include define endl n define ll long l...
演算法入門 樹鏈剖分 輕重鏈剖分
目錄 3.0 求 lca 4.0 利用資料結構維護資訊 5.0 例題 參考資料 資料結構入門 線段樹 發表於 2019 11 28 20 39 dfkuaid 摘要 線段樹的基本 建樹 區間查詢 單點修改 及高階操作 區間修改 單點查詢 區間修改 區間查詢 標記下傳 標記永久化 閱讀全文 樹鏈剖分用...