几乎全RE求调
查看原帖
几乎全RE求调
783336
Earth_Sky楼主2024/5/31 12:57
#include<bits/stdc++.h>
using namespace std;
const int MAX=2e5+5;
int n,m,r,p;
int a[MAX<<2],laz[MAX<<2];
int h[MAX],e[MAX],ne[MAX],w[MAX],wt[MAX],tot;
int son[MAX],id[MAX],fa[MAX],cnt;
int dep[MAX],siz[MAX],top[MAX],res;
void add(int x,int y){
	e[++tot]=y;
	ne[tot]=h[x];
	h[x]=tot;
}
//--------------------分割线-以下为线段树--------------------
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));
	a[rt<<1|1]+=laz[rt]*(len>>1);
	a[rt<<1]%=p;
	a[rt<<1|1]%=p;
	laz[rt]=0;
}
void build(int rt,int l,int r){
	if(l==r){
		a[rt]=wt[l];
		if(a[rt]>p) a[rt]%=p;
		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])%p;
}
void query(int rt,int l,int r,int L,int R){
	if(L<=l&&r<=R){
		res+=a[rt];
		res%=p;
		return;
	}
	else
	{
		if(laz[rt]) pushdown(rt,r-l+1);
		if(L<=(l+r>>1)) query(rt<<1,l,l+r>>1,L,R);
		if(R>(l+r>>1)) query(rt<<1|1,l+r>>1+1,r,L,R);
	}
}
void updata(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<=(l+r>>1)) updata(rt<<1,l,l+r>>1,L,R,k);
		if(R>(l+r>>1)) updata(rt<<1|1,l+r>>1+1,r,L,R,k);
		a[rt]=(a[rt<<1]+a[rt<<1|1])%p;
	}
} 
//--------------------分割线-以上为线段树--------------------
int qrange(int x,int y){
	int ans=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		res=0;
		query(1,1,n,id[top[x]],id[x]);
		ans+=res;
		ans%=p;
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	res=0;
	query(1,1,n,id[x],id[y]);
	ans+=res;
	return ans%p;
}
void updrange(int x,int y,int k){
	k%=p;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		updata(1,1,n,id[top[x]],id[x],k);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	updata(1,1,n,id[x],id[y],k);
}
int qson(int x){
	res=0;
	query(1,1,n,id[x],id[x]+siz[x]-1);
	return res;
}
void updson(int x,int k){
	updata(1,1,n,id[x],id[x]+siz[x]-1,k);
}
void dfs1(int x,int f,int deep){
	dep[x]=deep;fa[x]=f;siz[x]=1;
	int maxson=-1;
	for(int i=h[x];i!=-1;i=ne[i]){
		int y=e[i];
		if(y==f) continue;
		dfs1(y,x,deep+1);
		siz[x]+=siz[y];
		if(siz[y]>maxson) son[x]=y,maxson=siz[y];
	}
}
void dfs2(int x,int topf){
	id[x]=++cnt;wt[cnt]=w[x];top[x]=topf;
	if(!son[x]) return;
	dfs2(son[x],topf);
	for(int i=h[x];i!=-1;i=ne[i]){
		int y=e[i];
		if(y==fa[x]||y==son[x]) continue;
		dfs2(y,y);
	}
}
int main(){
	ios::sync_with_stdio(NULL);
	cin.tie(0);cout.tie(0);
	memset(h,-1,sizeof h);
	cin>>n>>m>>r>>p;
	for(int i=1;i<=n;i++) cin>>w[i];
	for(int i=1;i<n;i++){
		int a,b;cin>>a>>b;
		add(a,b);add(b,a);
	}
	dfs1(r,0,1);
	dfs2(r,r);
	build(1,1,n);
	while(m--){
		int k,x,y,z;
		cin>>k;
		if(k==1){
			cin>>x>>y>>z;
			updrange(x,y,z);
		}
		else if(k==2){
			cin>>x>>y;
			cout<<qrange(x,y)<<endl;
		}
		else if(k==3){
			cin>>x>>y;
			updson(x,y);
		}
		else
		{
			cin>>x;
			cout<<qson(x);
		}
	}

	return 0;
}

如题

2024/5/31 12:57
加载中...