【悬 2 关】树剖板子 TLE 80pts 求助
查看原帖
【悬 2 关】树剖板子 TLE 80pts 求助
737242
linch吃瓜猫楼主2025/1/1 22:18

rt,record link,是写假了吗?

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int cnt;
long long n,q,a[maxn],mnid[maxn],mxid[maxn],val[maxn];
long long tr[maxn<<2],tg[maxn<<2];
long long hson[maxn],dfn[maxn],h[maxn],f[maxn],sz[maxn],dep[maxn];
vector<vector<int> >e(maxn<<1);

void init(){
	h[0]=1;
	for(int i=1;i<=n;i++){
		h[i]=i;
	}
}

void push_up(int num){
	tr[num]=tr[num<<1]+tr[num<<1|1];
}

void push_down(int s,int t,int num){
	int mid=s+t>>1;
	if(tg[num]){
		tr[num<<1]=tr[num<<1]+tg[num]*(mid-s+1);
		tr[num<<1|1]=tr[num<<1|1]+tg[num]*(t-mid);
		tg[num<<1]+=tg[num];
		tg[num<<1|1]+=tg[num];
		tg[num]=0;
	}
}

void buid(int s,int t,int num){
	if(s==t){
		tr[num]=val[s];
		return;
	}
	int mid=s+t>>1;
	buid(s,mid,num<<1);buid(mid+1,t,num<<1|1);
	push_up(num);
}

void add(int l,int r,int s,int t,int num,long long x){
	if(t<=r && l<=s){
		tr[num]=tr[num]+(t-s+1)*x;
		tg[num]+=x;
		return;
	}
	push_down(s,t,num);
	int mid=s+t>>1;
	if(l<=mid) add(l,r,s,mid,num<<1,x);
	if(r>mid) add(l,r,mid+1,t,num<<1|1,x);
	push_up(num);
}

long long qry(int l,int r,int s,int t,int num){
	if(s>=l && t<=r){
		return tr[num];
	}
	int mid=s+t>>1;
	long long sum=0;
	push_down(s,t,num);
	if(l<=mid) sum+=qry(l,r,s,mid,num<<1);
	if(r>mid) sum+=qry(l,r,mid+1,t,num<<1|1);
	return sum;
}

void dfs1(int x){
	int y=0;
	for(int v:e[x]){
		if(v==f[x]) continue;
		dep[v]=dep[x]+1;
		f[v]=x;
		dfs1(v);
		sz[x]+=sz[v];
		if(sz[v]>sz[y]) y=v;
	}
	sz[x]++;
	if(sz[x]==0) sz[x]=1;
	else hson[x]=y;
}

void dfs2(int x){
	dfn[x]=++cnt;
	val[cnt]=a[x];
	mnid[x]=cnt;
	if(hson[x]){
		h[hson[x]]=h[x];
		dfs2(hson[x]);
	}
	for(int v:e[x]){
		if(v!=hson[x] && v!=f[x]){
			dfs2(v);
		}
	}
}

void Change(int s,int t,long long x){
	while(h[s]!=h[t]){
		if(dep[h[s]]>dep[h[t]]){
			add(dfn[h[s]],dfn[s],1,n,1,x);
			s=f[h[s]];
		}
		else{
			add(dfn[h[t]],dfn[t],1,n,1,x);
			t=f[h[t]];
		}
	}
	add(min(dfn[s],dfn[t]),max(dfn[s],dfn[t]),1,n,1,x);
}

int main(){
	cin>>n;
	init();
	for(int i=1;i<=n-1;i++){
		int u,v;
		cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dep[0]=1;
	dfs1(0);
	dfs2(0);
	buid(1,n,1);
	cin>>q;
	for(int i=1;i<=q;i++){
		char op;
		int x,y,z;
		cin>>op;
		if(op=='A'){
			cin>>x>>y>>z;
			Change(x,y,z);
		}
		else{
			cin>>x;
			cout<<qry(mnid[x],mnid[x]+sz[x]-1,1,n,1)<<"\n";
		}
	}
	return 0;
}
2025/1/1 22:18
加载中...