社区讨论

蒟蒻树剖求调2333

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@lwrn2two
此快照首次捕获于
2024/05/29 17:43
2 年前
此快照最后确认于
2024/05/29 20:44
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define lson k << 1
#define rson k << 1 | 1
#define int long long
typedef long long LL;
const int N = 1e5+7;
using namespace std;
int n,q,en,head[N];
int hson[N],fat[N],siz[N],dep[N];
int top[N],seg[N],id[N]; 
int tree[N << 2],lazy[N << 2];
struct Edge{
	int to,next;
}edge[N << 1];
inline void read(LL &x){
	char ch,last = ' ';
	while ((ch=getchar())<'0' || ch>'9') last = ch;
	for (x=0;ch>='0' && ch<='9';ch=getchar())
		x = x*10+ch-'0';
	if (last=='-') x = -x;
}
inline void add(LL x,LL y){
	edge[++en].to = y;
	edge[en].next = head[x];
	head[x] = en;
}
void init(){
	read(n);
	for(int i=1;i<n;i++){
		int a,b;
		read(a);read(b);
		add(a+1,b+1);
		add(b+1,a+1);
	}
}

void dfs1(int u,int fa){
	fat[u] = fa;
	dep[u] = dep[fa]+1;
	siz[u] = 1;
	for(int i=head[u];i;i=edge[i].next ){
		int v=edge[i].to;
		if(v!=fat[u]){
			dfs1(v,u);
			siz[u]+=siz[v];
			if(siz[v]>siz[hson[u]]) hson[u] = v;
		}
	}
}
void dfs2(int u,int Top){
	seg[0]++;
	id[u] = seg[0];
	seg[seg[0]] = u;
	top[u] = Top;
	if(!hson[u]) return;
	dfs2(hson[u],Top);
	for(int i=head[u];i;i=edge[i].next){
		int v = edge[i].to ;
		if(!top[v])
			dfs2(v,v);			
	}
}
void pushup(int k){
	tree[k] = tree[lson] + tree[rson];
}
void pushdown(int k,int l,int r){
	if(lazy[k]){
		int mid = (l+r)/2;
		tree[lson] = tree[lson]+(mid-l+1)*lazy[k];
		lazy[lson] = lazy[lson]+lazy[k];
	
		tree[rson] = tree[rson]+(r-mid)*lazy[k];
		lazy[rson] = lazy[rson]+lazy[k];
	
		lazy[k] = 0;		
	}

}

void update(int k,int l,int r,int x,int y,int d){
	if(l>y || r<x) return;
	if(x<=l && r<=y){
		tree[k] = tree[k]+(r-l+1)*d;
		lazy[k] = lazy[k]+d;
		return;
	}
	pushdown(k,l,r);
	int mid = (l+r)/2;
	update(lson,l,mid,x,y,d);
	update(rson,mid+1,r,x,y,d);
	pushup(k);
}
void jia(int x,int y,int z){
	while (top[x]!=top[y]){
		if (dep[top[x]]<dep[top[y]]) swap(x,y);
		update(1,1,n,id[top[x]],id[x],z);
		x = fat[top[x]];
	}
	if (dep[x]>dep[y]) swap(x,y);
	update(1,1,n,id[x],id[y],z);
}

int query(int k,int l,int r,int x,int y){
	if(l>y || r<x) return 0;
	if(x<=l && r<=y) return tree[k];
	pushdown(k,l,r);
	int mid = (l+r)/2;
	return query(lson,l,mid,x,y) + query(rson,mid+1,r,x,y);
}

void solve(){
	scanf("%lld",&q);
	 for (int i=1;i<=q;i++){
        int u,v,d;
        
        char c;
        scanf("%s",&c);
        if (c=='A'){
            scanf("%lld%lld%lld",&u,&v,&d);
            jia(u+1,v+1,d);
        }
        else{
            scanf("%lld",&u);
            printf("%lld\n",query(1,1,n,seg[u+1],seg[u + 1] + siz[u + 1] - 1));
        }
    }
}

signed main(){
	init();
	dfs1(1,0);
	dfs2(1,1);
	solve();
	return 0;
}

回复

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

正在加载回复...