const int MAX_N=100100;
vector<int>v[MAX_N];
struct node{
int sum,lazy,l,r,ls,rs;
}node[2*MAX_N];
int root,n,m,r,a[MAX_N],cnt,head[MAX_N],fa[MAX_N],deep[MAX_N],size[MAX_N],son[MAX_N],seq[MAX_N],top[MAX_N],id[MAX_N];
void dfs1(int now,int fa,int depth){
fa[now]=fa;
deep[now]=depth;
size[now]=1;
for(i=0;i<v[now].size();i++){
int to=v[now][i];
if(to==fa)
continue;
dfs1(to,now,depth+1);
size[now]+=size[to];
if(size[to]>size[son[now]])
son[now]=to;
}
}
void dfs2(int now,int t){
top[now]=t;
id[now]=++cnt;
pos[cnt]=now;
if(!son[now])
return;
dfs2(son[now],t);
for(i=0;i<v[now].size();i++){
int to=v[now][i];
if(to!=son[now]&&to!=fa[now])
dfs2(to,to);
}
}
int sum(int x,int y){
int ans=0;
int fx=top[x];
int fy=top[y];
while(fx!=fy){
if(deep[fx]>=deep[fy]){
ans+=query(root,id[fx],id[x]);
x=fa[fx];
fx=top[x];
}
else{
ans+=query(root,id[fy],id[y]);
y=fa[fy];
fy=top[y];
}
}
if(id[x]<=id[y])
ans+=query(root,id[x],id[y]);
else
ans+=query(root,id[y],id[x]);
return ans;
}
树链剖分模板
最新推荐文章于 2020-06-28 18:38:16 发布