37pts,wa#4~#10,求调
查看原帖
37pts,wa#4~#10,求调
489890
SFlyer楼主2023/11/17 09:35
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

const int N = 1e5+5;

ll n,m,rt,mod,w[N];
int dfn[N],tot,top[N],fa[N],son[N],dep[N],siz[N],rnk[N];
vector<int> g[N]; 

ll dat[N<<2],tag[N<<2];
void pu(int k){
	dat[k]=(dat[k<<1]+dat[k<<1|1])%mod;
}
void pd(int k,ll l,ll r){
	if (tag[k]){
		ll mid=l+r>>1;
		tag[k<<1]=(tag[k<<1]+tag[k])%mod;
		tag[k<<1|1]=(tag[k<<1|1]+tag[k])%mod;
		dat[k<<1]=(dat[k<<1]+(l-mid+1)*tag[k]%mod)%mod;
		dat[k<<1|1]=(dat[k<<1|1]+(r-mid)*tag[k]%mod)%mod;
		tag[k]=0;
	}
}
void bd(int k,int l,int r){
	tag[k]=0;
	if (l==r){
		dat[k]=w[rnk[l]]%mod;
		return;
	}
	int mid=l+r>>1;
	bd(k<<1,l,mid);
	bd(k<<1|1,mid+1,r);
	pu(k);
}
void upd(int k,int l,int r,int ql,int qr,ll ad){
	if (l>qr || r<ql){
		return;
	}
	if (ql<=l && r<=qr){
		tag[k]=(tag[k]+ad)%mod;
		dat[k]=(dat[k]+ad*(r-l+1)%mod)%mod;
		return;
	}
	pd(k,l,r);
	int mid=l+r>>1;
	upd(k<<1,l,mid,ql,qr,ad);
	upd(k<<1|1,mid+1,r,ql,qr,ad);
	pu(k);
}
ll qy(int k,int l,int r,int ql,int qr){
	if (l>qr || r<ql){
		return 0;
	}
	if (ql<=l && r<=qr){
		return dat[k];
	}
	pd(k,l,r);
	int mid=l+r>>1;
	ll vl=qy(k<<1,l,mid,ql,qr);
	ll vr=qy(k<<1|1,mid+1,r,ql,qr);
	return vl+vr;
}

void dfs1(int u,int fz){
	ll mx=0;
	siz[u]=1;
	fa[u]=fz;
	dep[u]=dep[fz]+1;
	for (auto v : g[u]){
		if (v!=fz){
			dfs1(v,u);
			siz[u]+=siz[v];
			if (siz[v]>mx){
				mx=siz[v];
				son[u]=v;
			}
		}
	}
}
void dfs2(int u,int tp){
	top[u]=tp;
	dfn[u]=++tot;
	rnk[tot]=u;
	if (!son[u]){
		return;
	}
	dfs2(son[u],tp);
	for (auto v : g[u]){
		if (v!=fa[u] && v!=son[u]){
			dfs2(v,v);
		}
	}
}

// qys
void upd_sub(int x,ll z){
	upd(1,1,n,dfn[x],dfn[x]+siz[x]-1,z);
} 
void qy_sub(int x){
	cout<<qy(1,1,n,dfn[x],dfn[x]+siz[x]-1)<<"\n";
}
void upd_chain(int x,int y,ll z){
	while (top[x]!=top[y]){
		if (dep[top[x]]<dep[top[y]]){
			swap(x,y);
		}
		upd(1,1,n,dfn[top[x]],dfn[x],z);
		x=fa[top[x]];
	}
	if (dep[x]>dep[y]){
		swap(x,y);
	}
	upd(1,1,n,dfn[x],dfn[y],z);
}
void qy_chain(int x,int y){
	ll ans=0;
	while (top[x]!=top[y]){
		if (dep[top[x]]<dep[top[y]]){
			swap(x,y);
		}
		ans+=qy(1,1,n,dfn[top[x]],dfn[x]);
		ans%=mod;
		x=fa[top[x]];
	}
	if (dep[x]>dep[y]){
		swap(x,y);
	}
	ans+=qy(1,1,n,dfn[x],dfn[y]);
	ans%=mod;
	cout<<ans<<"\n";
}
//

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin>>n>>m>>rt>>mod;
	for (int i=1; i<=n; i++){
		cin>>w[i];
	}
	for (int i=1; i<n; i++){
		int u,v;
		cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	dfs1(rt,0);
	dfs2(rt,rt);
	bd(1,1,n);
	while (m--){
		int op;
		cin>>op;
		if (op==1){
			ll x,y,z;
			cin>>x>>y>>z;
			upd_chain(x,y,z);
		}
		else if (op==2){
			int x,y;
			cin>>x>>y;
			qy_chain(x,y);
		}
		else if (op==3){
			ll x,z;
			cin>>x>>z;
			upd_sub(x,z);
		}
		else{
			ll x;
			cin>>x;
			qy_sub(x);
		}
	}
	return 0;
}
2023/11/17 09:35
加载中...