蒟蒻树剖T5个点,WA2个点
查看原帖
蒟蒻树剖T5个点,WA2个点
576448
aulive楼主2023/9/15 22:00

记录

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e5;
char opt;
int n,fa[maxn+5],top[maxn+5],size[maxn+5],son[maxn+5],dept[maxn+5],ys[maxn+5],a,b,tot,x,y,z;
vector <int> rood[maxn+5];
struct node{
	int lef,rig,sum,add;
}tree[maxn<<2|1];
void dfs1(int now,int fat){
	fa[now]=fat;
	dept[now]=dept[fat]+1;
	size[now]=1;
	for(int i=0;i<rood[now].size();i++){
		int to=rood[now][i];
		if(to==fat)continue;
		dfs1(to,now);
		size[now]+=size[to];
		if(size[son[now]]<=size[to])son[now]=to;
	}
}
void dfs2(int now,int topf){
	ys[now]=++tot;
	top[now]=topf;
	if(!son[now])return;
	dfs2(son[now],now);
	for(int i=0;i<rood[now].size();i++){
		int to=rood[now][i];
		if(top[to])continue;
		dfs2(to,to);
	}
}
void pushup(int now){
	tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum;
}
void pushdown(int now){
	if(tree[now].add){
		tree[now<<1].add+=tree[now].add;
		tree[now<<1|1].add+=tree[now].add;
		tree[now<<1].sum+=tree[now].add*(tree[now<<1].rig-tree[now<<1].lef+1);
		tree[now<<1|1].sum+=tree[now].add*(tree[now<<1|1].rig-tree[now<<1|1].lef+1);
		tree[now].add=0;
	}
}
void build(int now,int lef,int rig){
	tree[now].lef=lef,tree[now].rig=rig;
	if(lef==rig){
		return;
	}
	int mid=lef+rig>>1;
	build(now<<1,lef,mid);
	build(now<<1|1,mid+1,rig);
}
void modify(int now,int lef,int rig,int add){
	if(lef<=tree[now].lef&&tree[now].rig<=rig){
		tree[now].add+=add;
		tree[now].sum+=add*(tree[now].rig-tree[now].lef+1);
		return;
	}
	pushdown(now);
	int mid=tree[now].lef+tree[now].rig>>1;
	if(lef<=mid)modify(now<<1,lef,rig,add);
	if(mid<rig)modify(now<<1|1,lef,rig,add);
	pushup(now);
}
int query(int now,int lef,int rig){
	if(lef<=tree[now].lef&&tree[now].rig<=rig){
		return tree[now].sum;
	}
	pushdown(now);
	int mid=tree[now].lef+tree[now].rig>>1;
	int res=0;
	if(lef<=mid)res=query(now<<1,lef,rig);
	if(mid<rig)res+=query(now<<1|1,lef,rig);
	return res;
}
void tree_modify(int x,int y,int add){
	while(top[x]!=top[y]){
		if(dept[top[x]]<dept[top[y]])swap(x,y);
		modify(1,ys[top[x]],ys[x],add);
		x=fa[top[x]];
	}
	if(dept[x]>dept[y])swap(x,y);
	modify(1,ys[x],ys[y],add);
}
signed main(){
	cin>>n;
	for(int i=1;i<n;i++){
		scanf("%lld%lld",&a,&b);
		++a,++b;
		rood[a].push_back(b);
		rood[b].push_back(a);
	}
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,tot);
	cin>>n;
	while(n--){
		cin>>opt;
		scanf("%lld",&x);
		++x;
		if(opt=='Q'){
			printf("%lld\n",query(1,ys[x],ys[x]+size[x]-1));
		}else{
			cin>>y>>z;
			++y;
			tree_modify(x,y,z);
		}
	}
	return 0;
}
2023/9/15 22:00
加载中...