社区讨论

0pts WA+TLE求条

P3833[SHOI2012] 魔法树参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhjsp4ua
此快照首次捕获于
2025/11/04 07:52
4 个月前
此快照最后确认于
2025/11/04 07:52
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int N=1e5+5;
int n,q,dfncnt;
int fa[N],dep[N],sz[N],dfn[N],hson[N],top[N];
vector<int>g[N];
struct SGT{
	#define ls i<<1
	#define rs i<<1|1
	struct node{
		int l,r,sum,tag;
	}t[N<<2];
	inline void addtag(int i,int x){
		t[i].tag+=x;
		t[i].sum+=(t[i].r-t[i].l+1)*x;
	}
	inline void pushup(int i){
		t[i].sum=t[ls].sum+t[rs].sum;
	}
	inline void pushdown(int i){
		if(t[i].tag){
			addtag(ls,t[i].tag);
			addtag(rs,t[i].tag);
		}
	}
	void build(int i,int l,int r){
		t[i]={l,r,0,0};
		if(l==r) return;
		int mid=l+r>>1;
		build(ls,l,mid);
		build(rs,mid+1,r);
	}
	void update(int i,int l,int r,int x){
		if(l<=t[i].l&&t[i].r<=r){
			addtag(i,x);
			return;
		}
		pushdown(i);
		int mid=t[i].l+t[i].r>>1;
		if(l<=mid) update(ls,l,r,x);
		if(r>=mid+1) update(rs,l,r,x);
		pushup(i);
	}
	int query(int i,int l,int r){
		if(l<=t[i].l&&t[i].r<=r) return t[i].sum;
		pushdown(i);
		int mid=t[i].l+t[i].r>>1,ans=0;
		if(l<=mid) ans=query(ls,l,r);
		if(r>=mid+1) ans+=query(rs,l,r);
		return ans;
	}
}sgt;
void dfs1(int u,int f){
	dep[u]=dep[f]+1;
	sz[u]=1;
	for(int v:g[u]){
		dfs1(v,u);
		sz[u]+=sz[v];
		if(sz[v]>sz[hson[u]]) hson[u]=v;
	}
}
void dfs2(int u,int tp){
	top[u]=tp;
	dfn[u]=++dfncnt;
	if(hson[u]) dfs2(hson[u],tp);
	for(int v:g[u]){
		if(v==hson[u]) continue;
		dfs2(v,v);
	}
}
void update(int u,int v,int x){
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		sgt.update(1,dfn[top[u]],dfn[u],x);
		x=fa[top[x]];
	}
	if(dep[u]>dep[v]) swap(u,v);
	sgt.update(1,dfn[u],dfn[v],x);
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n;
	rep(i,1,n-1){
		int u,v;
		cin>>u>>v;
		u++,v++;
		g[u].push_back(v);
		fa[v]=u;
	}
	dfs1(1,0);dfs2(1,1);
	sgt.build(1,1,n);
	cin>>q;
	while(q--){
		char op;
		cin>>op;
		if(op=='A'){
			int u,v,d;
			cin>>u>>v>>d;
			u++,v++;
			update(u,v,d);
		}else{
			int u;cin>>u;u++;
			cout<<sgt.query(1,dfn[u],dfn[u]+sz[u]-1)<<'\n';
		}
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...