1 #include2using
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...