树链剖分的代码:
struct node{
int to,nxt;
}ed[maxn<<1];
int head[maxn],cnt;
void addedge(int u,int v){
ed[cnt].to=v;
ed[cnt].nxt=head[u];
head[u]=cnt++;
}
int sz[maxn],top[maxn],son[maxn],fa[maxn],dep[maxn],p[maxn];
//sz[]树的size top[]每个节点top的编号 son[]size最大的儿子 fa[]父亲节点 dep[]结点深度,p[]分后的编号
int pos;
void dfs1(int u,int pre,int d){
fa[u]=pre;
sz[u]=1;
dep[u]=d;
for(int i=head[u];~i;i=ed[i].nxt){
int v=ed[i].to;
if(v==pre)continue;
dfs1(v,u,d+1);
if(son[u]==-1||sz[v]>sz[son[u]])son[u]=v;
sz[u]+=sz[v];
}
}
void dfs2(int u,int tp){
top[u]=tp;
p[u]=pos++;
if(son[u]==-1)return;
dfs2(son[u],tp);
for(int i=head[u];~i;i=ed[i].nxt){
int v=ed[i].to;
if(v==son[u]||v==fa[u])continue;
dfs2(v,v);
}
}
void init(){
memset(head,-1,sizeof(head));
memset(son,-1,sizeof(son));
cnt=0;
pos=1;
}