Gym 101908L 樹鏈剖分裸題

2022-09-08 20:24:11 字數 2154 閱讀 4827

題目大意:

一棵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 摘要 線段樹的基本 建樹 區間查詢 單點修改 及高階操作 區間修改 單點查詢 區間修改 區間查詢 標記下傳 標記永久化 閱讀全文 樹鏈剖分用...