樹鏈剖分模板

2021-09-19 04:18:54 字數 3183 閱讀 4125

大佬部落格:

模板題:

重兒子(非葉子結點):它某個點的作為兒子,且是兒子中子樹結點數最多的兒子。

輕兒子(非葉子結點):非重兒子

重邊:乙個父親連線他的重兒子的邊稱為重邊

輕邊:非重邊

重鏈:相鄰重邊連起來

連線乙個重兒子

每個葉子結點,如果是輕兒子,則有一條以自己為起點的長度為1的鏈

把csdn當做雲盤

模板

#include

using

namespace std;

#define for0(a,b) for(int i = a; i < b; ++i)

#define fore(a,b) for(int i = a; i <= b; ++i)

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

typedef

long

long ll;

typedef pair<

int,

int> pii;

const

int maxn =

2e5+5;

// 變數

int n,m,mod;

vector<

int> g[maxn]

;int w[maxn]

;// 點權值

// 線段樹

int val[maxn<<2]

, lazy[maxn<<2]

;// 樹鏈剖分

int son[maxn]

, id[maxn]

, fa[maxn]

,dep[maxn]

,siz[maxn]

,top[maxn]

,wt[maxn]

;int cnt;

//------------------------------

// 線段樹部分

void

pushup

(int rt)

void

pushdown

(int rt,

int l,

int r)

}void

build

(int l,

int r,

int rt)

int mid =

(l+r)

>>1;

build

(lson)

;build

(rson)

;pushup

(rt);}

void

update

(int l,

int r,

int k,

int l,

int r,

int rt)

int mid =

(l+r)

>>1;

pushdown

(rt,l,r)

;update

(l,r,k,lson)

;update

(l,r,k,rson)

;pushup

(rt);}

intquery

(int l,

int r,

int l,

int r,

int rt)

int mid =

(l+r)

>>1;

int res =0;

pushdown

(rt,l,r)

; res +

=query

(l,r,lson)

; res %

= mod;

res +

=query

(l,r,rson)

; res %

= mod;

pushup

(rt)

;return res;

}//------------------------------

//樹鏈剖分,操作

// 求和

intqrange

(int x,

int y)

// 在同一條鏈上了

if(dep[x]

> dep[y]

)swap

(x,y)

; ans +

=query

(id[x]

,id[y],1

,n,1);

ans %

= mod;

return ans;

}// 更新

void

updrange

(int x,

int y,

int k)

if(dep[x]

> dep[y]

)swap

(x,y)

;update

(id[x]

,id[y]

,k,1

,n,1);

}int

qson

(int x)

void

updson

(int x,

int k)

//------------------------------

// 樹鏈剖分, 處理鏈

// u 當前結點,f父親,deep深度

void

dfs1

(int u,

int f,

int deep)}}

// u 當前結點,topf當前鏈的最頂端的節點

void

dfs2

(int u,

int topf)

}//------------------------------

intmain()

dfs1

(rt,-1

,1);

dfs2

(rt,rt)

;build(1

,n,1);

int opt,x,y,z;

for(

int i =

0; i < q;

++i)

else

if(opt ==2)

else

if(opt ==3)

else

if(opt ==4)

}return0;

}

樹鏈剖分 模板

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...