樹鏈剖分模板

2022-05-23 21:42:09 字數 2223 閱讀 2403

1 #include2

using

namespace

std;

3const

int maxn=1e5+5;4

//要開long long!

5#define ll long long

6 vectornei[maxn];

7struct

tedge

815 } edge[maxn]; //

邊資訊

16struct

node

1725 } tree[4*maxn]; //

線段樹

26int newid[maxn]; //

27int newarr[maxn]; //

剖分後產生的新陣列

28int cnt,top[maxn]; //

cnt為時間戳,top為每個節點所在重鏈中深度最淺的節點編號

29int par[maxn]; //

每個節點的父節點

30int size[maxn]; //

以x節點為根節點的子樹的節點數量

31int eid[maxn]; //

par[x]---->x的邊的cost

32int dep[maxn]; //

每個節點的深度

33void dfs(const

int &v,const

int &pa,const

int &ndep) //

遍歷樹,找出每個節點深度、父節點、size

3445}46

47void makehardpath(const

int &v,const

int &pa,const

int &to) //

遍歷樹,找出重鏈

4862}63

if(!masiz) return;64

makehardpath(cho,v,to);

65for(int i=0;i)

6671}72

void buildtree(const

int &i,const

int &l,const

int &r) //

建線段樹

7379

else

8086

}87 inline void pushdown(const

int &i) //

下推標記

8896 inline void treeupdate(const

int &i,const

int &l,const

int &r,const ll &z) //

區間更新

97105

else

106114

}115

116 inline ll query(const

int &i,const

int &l,const

int &r) //

查詢 117

123else

124131

}132 inline ll que(int x,int

y) 133

141if(x!=y)

142146

return

res;

147}

148 inline void add(int x,int y,int

z)149

156if(x!=y)

157161

}162

void

init()

163177

}178

intmain()

179193 dfs(1,1,0

);194

for(int i=0;i1;i++)

195200

else

201204

}205 makehardpath(1,1,1

);206 buildtree(1,1

,n);

207while(m--)

208218

else

219223

}224

}225

return0;

226 }

樹鏈剖分 模板

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