樹鏈剖分模板

2021-10-05 10:18:39 字數 2491 閱讀 8054

模板題

這個題的需求是給定一棵樹,操作支援區間修改和點查詢,我們一樣用線段樹維護區間和實現區間查詢。

三種操作i、d、q分別是對於一條路徑上的點增/減和詢問某個點的當前值

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

4647

4849

5051

5253

5455

5657

5859

6061

6263

6465

6667

6869

7071

7273

7475

7677

7879

8081

8283

8485

8687

8889

9091

9293

9495

9697

9899

100101

102103

104105

106107

108109

110111

112113

114115

116117

118119

120121

122123

124125

126127

128129

130131

132133

134135

136137

138139

140141

142143

144145

146147

148149

150151

152153

154155

156157

158159

160161

162163

164165

166167

168169

170171

172173

174

//樹剖(需求:區間修改,點查詢)

//剖分結束後,線段樹維護區間和

#include#include#include#includeusing namespace std;

#define ll long long

#define lson (rt<<1)

#define rson (rt<<1|1)

const int maxn=5e4+10;

int a[maxn];

int n,m,p;

structt[maxn<<2];

vectore[maxn];

int dep[maxn];

int fa[maxn];

int siz[maxn];

int son[maxn]; //重兒子

int dfn[maxn]; //樹上dfs序

int rnk[maxn]; //dfn的逆對映,用於建立線段樹

int top[maxn]; //所在重鏈的頭部

void pushup(int rt)

void pushdown(int rt,int l,int r)

return ;

}void build(int rt,int l,int r)

int m=(l+r)/2;

build(lson,l,m);

build(rson,m+1,r);

pushup(rt);

return;

}void update(int l,int r,int l,int r,int rt,int v)

pushdown(rt,l,r);

int m=(l+r)/2;

if(l<=m)

if(r>m)

pushup(rt);

}long long query(int l,int r,int l,int r,int rt)

pushdown(rt,l,r);

int m=(l+r)/2;

long long res=0ll;

if(l<=m)

if(r>m)

return res;

}void dfs1(int o,int from,int d)

}}int cnt;

void dfs2(int o,int t)

for(int i=0;idep[y])

update(dfn[x],dfn[y],1,n,1,v);

}int main()

for(int i=0;i

樹鏈剖分 模板

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