void dfs(ll x){
deep[x]=deep[dad[x]]+1;
size[x]=1;
for(ll i=0;i<vec[x].size();i++)
if(dad[x]!=vec[x][i]){
dad[vec[x][i]]=x;
dfs(vec[x][i]);
size[x]+=size[vec[x][i]];
}
}
void dfs1(ll x){
if(!top[x])top[x]=x;
dfn[x]=++cnt;
pos[cnt]=x;
ll t=0;
for(ll i=0;i<vec[x].size();i++)
if(dad[x]!=vec[x][i]&&size[vec[x][i]]>size[t])t=vec[x][i];
if(t)top[t]=top[x],dfs1(t);
for(ll i=0;i<vec[x].size();i++)
if(dad[x]!=vec[x][i]&&vec[x][i]!=t)dfs1(vec[x][i]);
}
void query(ll x,ll y){
ll ans=0;
for(;top[x]!=top[y];x=dad[top[x]]){
if(deep[top[x]]<deep[top[y]])swap(x,y);
ans+=ask(dfn[top[x]],dfn[x],1,n,1);
}
if(deep[x]>deep[y])swap(x,y);
ans+=ask(dfn[x],dfn[y],1,n,1);
printf("%lld\n",ans);
}
树链剖分模板
最新推荐文章于 2022-02-25 16:17:52 发布