树链剖分学习笔记
因为抄模板抄错(...),来来回回看了很多遍板子,debug了好久。感觉理解得很到位了。 洛谷P3384树链剖分 #include<bits/stdc++.h> #define debug printf("!"); using namespace std; typedef long long ll; const int maxn=2e5+50; vector<int>p[maxn]; int val[maxn],mod; int siz[maxn],dep[maxn],fad[maxn],son[maxn]; int top[maxn],tid[maxn],rnk[maxn],cnt; /* siz[i] 保存以i为根的树的大小 dep[i] i节点的深度 fad[i] i的父亲 son[i] i的重儿子 top[i] 重链的顶端节点 tid[i] i的新编号(dfs) rnk[i] rnk[tid[i]]=i */ inline void dfs1(int u,int fa,int d) { /* u 当前节点 fa 父亲 d 深度 */ dep[u]=d; fad[u]=fa; siz[u]=1; for(int i=0;i<p[u].size();i++) { int v=p[u][i]; if(v==fa)continue; dfs1(v,u,d+1); siz[u]+