樹鏈剖分 模板

2022-06-08 21:39:14 字數 2314 閱讀 4680

參考部落格

妙wa

部落格上講的挺詳細的,也比較簡單易懂

【樹鏈剖分】

感覺挺妙的,其實樹剖並不是很難,就是**有些繁瑣。

/*

* @author: zhl

* @date: 2020-10-13 20:36:59

*/#include#define rep(i,a,b) for(int i = a;i <= b;i++)

#define repe(i,u) for(int i = head[u];i;i = e[i].next)

#define mid (l+r>>1)

#define lo (o<<1)

#define ro (o<<1|1)

using namespace std;

const int n = 4e5 + 10;

int a[n];

int n, m, root, mod;

struct edge e[n << 1];

int head[n], tot;

void addedge(int from, int to) ;

head[from] = tot++;

}int fa[n], sz[n], tfa[n], dep[n], son[n];

//dfs1處理dep,sz,fa,son(重兒子)

void dfs1(int u, int p)

}int cnt;

int id[n], val[n], top[n];

//dfs2 剖分數鏈

void dfs2(int u, int topf)

}int sum[n << 2], lz[n << 2];

int x, y, z;

void push_down(int o, int l, int r)

void build(int o, int l, int r)

build(lo, l, mid);

build(ro, mid + 1, r);

sum[o] += sum[lo] + sum[ro];

}void updt(int o, int l, int r)

push_down(o, l, r);

if (x <= mid)updt(lo, l, mid);

if (y > mid)updt(ro, mid + 1, r);

sum[o] = (sum[lo] + sum[ro]) % mod;

}int query(int o, int l, int r)

int ans = 0;

push_down(o, l, r);

if (x <= mid)ans = (ans + query(lo, l, mid)) % mod;

if (y > mid)ans = (ans + query(ro, mid + 1, r)) % mod;

return ans;

}int query_path(int a, int b)

if (dep[a] > dep[b])swap(a, b);

x = id[a]; y = id[b];

ans = (ans + query(1, 1, cnt)) % mod;

return ans;

}void updt_path(int a, int b, int k)

if (dep[a] > dep[b])swap(a, b);

x = id[a]; y = id[b]; z = k;

updt(1, 1, cnt);

}int main()

dfs1(root, 0);

dfs2(root, root);

build(1, 1, cnt);

while (m--)

if (op == 2)

if (op == 3)

if (op == 4) }}

/*5 50 2 24000

7 3 7 8 0

1 21 5

3 14 1

*/

debug一晚上的罪魁禍首。

**一刻鐘,

debug兩小時

bug 一字元

樹鏈剖分 模板

class match node a n struct no no aa n 4 void init void addpage int x,int y void dfs int s,int faa,int h 根節點,父節點和深度的 if max 0 son s sign void dfs2 int...

模板 樹鏈剖分

define maxn 50010 define l u u 1 define r u u 1 1 寫在類裡面爆棧 int n,m,q int tim 時間戳 int num maxn 樹上每個節點的初始值 int siz maxn siz u 表示以u為根的子樹的節點數 int top maxn ...

樹鏈剖分模板

點權模板 1 m a b c將節點a到節點b路徑上所有點都染成顏色c 2 q a b詢問節點a到節點b路徑上的顏色段數量 連續相同顏色被認為是同一段 如 112221 由3段組成 11 222 和 1 const int n 100100 struct edge g n 2 int cnt,head...