蒟蒻树剖求助,WA了7个点
查看原帖
蒟蒻树剖求助,WA了7个点
46030
ly2209124楼主2021/12/20 22:27
#include<bits/stdc++.h>
using namespace std;
const int maxn=200000+10;
#define ll long long
ll w[maxn],maxson[maxn],wt[maxn],id[maxn];
ll dep[maxn],laz[maxn<<2],a[maxn<<2];
ll siz[maxn],fa[maxn],top[maxn];
ll n,m,r,mod,tot,cnt;
ll head[maxn],ver[maxn],nex[maxn];
#define mid (l+r)>>1
void pushdown(int rt,int len){
	laz[rt<<1]+=laz[rt];
	laz[rt<<1|1]+=laz[rt];
	a[rt<<1]+=(laz[rt]*(len-(len>>1)))%mod;
	a[rt<<1|1]+=laz[rt]*(len>>1);
	a[rt<<1]%=mod;
	a[rt<<1|1]%=mod;
	laz[rt]=0;
} 
void build(int rt,int l,int r){
	if(l==r){
		a[rt]=wt[l];
		a[rt]%=mod;
		return;
	}
	build(rt<<1,l,(l+r)>>1);
	build(rt<<1|1,((l+r)>>1)+1,r);
	a[rt]=(a[rt<<1]+a[rt<<1|1])%mod;
}
ll query(int rt,int l,int r,int L,int R){
	ll ans=0;
	if(L<=l&&r<=R){
		ans+=a[rt];
		ans%=mod;
		return ans;
	}
	if(laz[rt]) pushdown(rt,r-l+1);
	if(L<=mid) ans+=query(rt<<1,l,(l+r)>>1,L,R);
	if(R>mid) ans+=query(rt<<1|1,((l+r)>>1)+1,r,L,R);
	return ans;
} 
ll update(int rt,int l,int r,int L,int R,int k){
	if(L<=l&&r<=R){
		laz[rt]+=k;
		a[rt]+=k*(r-l+1);
	}
	else{
		if(laz[rt]) pushdown(rt,r-l+1);
		if(L<=mid) update(rt<<1,l,(l+r)>>1,L,R,k);
		if(R>mid) update(rt<<1|1,((l+r)>>1)+1,r,L,R,k);
		a[rt]=(a[rt<<1]+a[rt<<1|1])%mod;
	}
}
ll qrange(int x,int y){
	ll ans=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans=(ans+query(1,1,n,id[top[x]],id[x]))%mod;
		x=fa[top[x]];
	}
	if(id[x]>id[y]) swap(x,y);
	ans+=query(1,1,n,id[x],id[y]);
	return ans%mod;
}
void uprange(int x,int y,int k){
	k%=mod;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y); 
		update(1,1,n,id[top[x]],id[x],k);
		x=fa[top[x]];
	}
	if(id[x]>id[y]) swap(x,y);
	update(1,1,n,id[x],id[y],k);
}
void add(int x,int y){
	tot++;ver[tot]=y;nex[tot]=head[x];head[x]=tot;
}
void dfs2(int x,int topx){
	cnt++;id[x]=cnt;
	wt[cnt]=w[x];top[x]=topx;
	if(!maxson[x]) return;
	dfs2(maxson[x],topx);
	for(int i=head[x];i;i=nex[i]){
		int y=ver[i];
		if(y==fa[x]||y==maxson[x]) continue;
		dfs2(y,y);
	} 
}
void dfs1(int x,int f,int deep){
	dep[x]=deep;
	siz[x]=1;
	fa[x]=f;
	int num_maxson=-1;
	for(int i=head[x];i;i=nex[i]){
		int y=ver[i];
		if(y==f) continue;
		dfs1(y,x,deep+1);
		siz[x]+=siz[y];
		if(siz[y]>num_maxson){
			maxson[x]=y;
			num_maxson=siz[y];
		}
	}
}
int main(){
	cin>>n>>m>>r>>mod;
	for(int i=1;i<=n;i++)cin>>w[i];
	for(int i=1;i<=n-1;i++){
		int aaa,bbb;
		cin>>aaa>>bbb;
		add(aaa,bbb);
		add(bbb,aaa);
	}
	dfs1(r,0,1);
	dfs2(r,r);
	build(1,1,n);
	while(m--){
		int ddd;cin>>ddd;
		if(ddd==1){
			int x,y,z;
			cin>>x>>y>>z;
			uprange(x,y,z);
		}
		else if(ddd==2){
			int x,y;
			cin>>x>>y;
			cout<<qrange(x,y)<<endl;
		}
		else if(ddd==3){
			int x,z;
			cin>>x>>z;
			update(1,1,n,id[x],id[x]+siz[x]-1,z); 
		}
		else {
			int x;
			cin>>x;
			cout<<query(1,1,n,id[x],id[x]+siz[x]-1)<<endl;
		}
	}
}

只过了1,3,4 找不到BUG了,求助QAQ

2021/12/20 22:27
加载中...