树链剖分模板

学习笔记

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值