73pts WA 求调
查看原帖
73pts WA 求调
1420231
yy0707楼主2025/1/25 07:41

想敲个模板,结果被制裁了。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=100001;
int n,m,r,mod,cnt,w[N],dep[N],fa[N],dfn[N],sz[N],ch[N],top[N];
vector<int>g[N];
struct segtree{
	int tr[400001],tag[400001];
	void update(int p){tr[p]=(tr[p*2]+tr[p*2+1])%mod;}
	void f(int p,int l,int r,int c){
		tr[p]+=(r-l+1)*c;
		tag[p]+=c;
	}
	void pushdown(int p,int l,int r){
		int mid=(l+r)/2;
		f(p*2,l,mid,tag[p]);
		f(p*2+1,mid+1,r,tag[p]);
		tag[p]=0;
		update(p);
	}void set(int k,int c,int p=1,int x=1,int y=n){
		if(x==y)return (tr[p]+=c)%=mod,void();
		pushdown(p,x,y);
		int mid=(x+y)/2;
		if(k<=mid)set(k,c,p*2,x,mid);
		else set(k,c,p*2+1,mid+1,y);
		update(p);
	}void apply(int l,int r,int c,int p=1,int x=1,int y=n){
		if(l==x&&r==y)return f(p,l,r,c);
		pushdown(p,x,y);
		int mid=(x+y)/2;
		if(r<=mid)apply(l,r,c,p*2,x,mid);
		else if(l>mid)apply(l,r,c,p*2+1,mid+1,y);
		else apply(l,mid,c,p*2,x,mid),apply(mid+1,r,c,p*2+1,mid+1,y);
		update(p);
	}int query(int l,int r,int p=1,int x=1,int y=n){
		if(l==x&&r==y)return tr[p];
		pushdown(p,x,y);
		int mid=(x+y)/2;
		if(r<=mid)return query(l,r,p*2,x,mid);
		if(l>mid)return query(l,r,p*2+1,mid+1,y);
		return (query(l,mid,p*2,x,mid)+query(mid+1,r,p*2+1,mid+1,y))%mod;
	}
}s;
void init(int u){
	sz[u]=1,dep[u]=dep[fa[u]]+1;
	for(auto v:g[u]){
		if(fa[u]!=v){
			fa[v]=u;
			init(v);
			sz[u]+=sz[v];
			if(sz[v]>sz[ch[u]])ch[u]=v;
		}
	}
}void dfs(int u,int t){
	dfn[u]=++cnt,top[u]=t;
	if(!ch[u])return;
	dfs(ch[u],t);
	for(auto v:g[u])if(fa[u]!=v&&ch[u]!=v)dfs(v,v);
}void modify(int x,int y,int z){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		s.apply(dfn[top[x]],dfn[x],z);
		x=fa[top[x]];
	}if(dep[x]<dep[y])swap(x,y);
	s.apply(dfn[y],dfn[x],z);
}int query(int x,int y){
	int res=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		(res+=s.query(dfn[top[x]],dfn[x]))%=mod;
		x=fa[top[x]];
	}if(dep[x]<dep[y])swap(x,y);
	return (res+s.query(dfn[y],dfn[x]))%mod;
}signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m>>r>>mod;
	for(int i=1;i<=n;++i)cin>>w[i];
	for(int i=1,u,v;i<n;++i){
		cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u);
	}init(r),dfs(r,r);
	for(int i=1;i<=n;++i)s.set(dfn[i],w[i]);
	for(int i=1,t,x,y,z;i<=m;++i){
		cin>>t;
		if(t==1)cin>>x>>y>>z,modify(x,y,z);
		else if(t==2)cin>>x>>y,cout<<query(x,y)<<'\n';
		else if(t==3)cin>>x>>z,s.apply(dfn[x],dfn[x]+sz[x]-1,z);
		else if(t==4)cin>>x,cout<<s.query(dfn[x],dfn[x]+sz[x]-1)<<'\n';
	}
}
2025/1/25 07:41
加载中...