模板題
這個題的需求是給定一棵樹,操作支援區間修改和點查詢,我們一樣用線段樹維護區間和實現區間查詢。
三種操作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...