萌新求助树剖 WA 30pts
查看原帖
萌新求助树剖 WA 30pts
23121
诱宵美⑨楼主2021/11/19 20:49

RT

#include <bits/stdc++.h>
//#define int long long
#define MAXN 200000
#define MAXM 500000
#define INF 1717986918400000000
#define gc getchar()
#define pc putchar
#define up(l,r,i) for(int i=l;i<=r;++i)
#define e(u,i) for(int i=hd[u];i;i=nxt[i])
using namespace std;
inline int rd(){
	int ret=0,pos=1;char c=gc;
	while(!isdigit(c) && c!='-') c=gc;
	if(c=='-') pos=-1,c=gc;
	while(isdigit(c)) ret=(ret<<3)+(ret<<1)+(c&15),c=gc;
	return ret*pos;
}
inline void wrt(int x){
	if(x<0) x=~x+1,putchar('-');
	if(x>9) wrt(x/10);
	putchar(x%10+'0');
}
int N,M,Rt,P;
int a[MAXN];
int hd[MAXN],to[MAXM],nxt[MAXM],cnt;
void add(int u,int v){nxt[++cnt]=hd[u];hd[u]=cnt;to[cnt]=v;}
void ADD(int U,int V){add(U,V);add(V,U);}
int dep[MAXN],fa[MAXN],siz[MAXN],son[MAXN],rnk[MAXN],dfn[MAXN],top[MAXN];
int tot;
void dfs1(int u,int f){
	//cout<<"dfs1 : "<<u<<' '<<f<<"\n";
	fa[u]=f;dep[u]=dep[f]+1;siz[u]=1;son[u]=-1;
	e(u,i){
		int v=to[i];
		if(v==f) continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(son[u]==-1 || siz[v]>siz[son[u]]) son[u]=v;
	}
}
void dfs2(int u,int t){
	top[u]=t;
	dfn[u]=++tot;
	rnk[tot]=u;
	if(son[u]==-1) return;
	dfs2(son[u],t);
	e(u,i){
		int v=to[i];
		if(v==fa[u] || v==son[u]) continue;
		dfs2(v,v);
	} 
}
int LCA(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y); 
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	return x;
}
int t[MAXN<<2],ls[MAXN<<2],rs[MAXN<<2],d[MAXN<<2],tg[MAXN<<2];
inline int L(int p){return p<<1;}
inline int R(int p){return p<<1|1;}
void pushup(int p){t[p]=t[L(p)]+t[R(p)];} 
void build(int p,int l,int r){
	ls[p]=l,rs[p]=r;d[p]=r-l+1;
	if(l==r){t[p]=a[rnk[l]];return;}
	int mid=(l+r)>>1;
	build(L(p),l,mid);
	build(R(p),mid+1,r);
	pushup(p);
}
void spd(int p,int k){
	tg[p]+=k;
	t[p]+=k*d[p];
}
void pushdown(int p){
	spd(L(p),tg[p]);
	spd(R(p),tg[p]);
	tg[p]=0;
}
void RA(int p,int l,int r,int k){
	if(l<=ls[p] && r>=rs[p]){spd(p,k);return;}
	pushdown(p);
	int mid=(ls[p]+rs[p])>>1;
	if(l<=mid) RA(L(p),l,r,k);
	if(r>mid) RA(R(p),l,r,k);
	pushup(p);
	return;
}
int RQ(int p,int l,int r){
	if(l<=ls[p] && r>=rs[p]){return t[p];}
	pushdown(p);
	int mid=(ls[p]+rs[p])>>1,ret=0;
	if(l<=mid) ret+=RQ(L(p),l,r);
	if(r>mid) ret+=RQ(R(p),l,r);
	return ret;
} 
void CA(int u,int v,int z){
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		RA(1,dfn[top[u]],dfn[u],z);
		u=fa[top[u]];
	}
	if(dep[u]>dep[v]) swap(u,v);
	RA(1,dfn[u],dfn[v],z);
}
int CQ(int u,int v){
	int ret=0;
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		ret+=RQ(1,dfn[top[u]],dfn[u]);ret%=P;
		u=fa[top[u]];
	}
	if(dep[u]>dep[v]) swap(u,v);
	ret+=RQ(1,dfn[u],dfn[v]);ret%=P;
	return ret;
}
void TA(int x,int z){
	RA(1,dfn[x],dfn[x]+siz[x]-1,z);
}
int TQ(int x){
	return RQ(1,dfn[x],dfn[x]+siz[x]-1);
}
signed main(){
	N=rd(),M=rd(),Rt=rd(),P=rd();
	up(1,N,i) a[i]=rd();
	up(1,N-1,i){int p=rd(),q=rd();ADD(p,q);}
	dfs1(Rt,0),dfs2(Rt,Rt);
//	up(1,N,i){
//		cout<<i<<' '<<fa[i]<<' '<<dep[i]<<'\n';
//	}
//	cout<<endl;
	build(1,1,N);
	while(M--){
		short op=rd();
		if(op==1){
			int x=rd(),y=rd(),z=rd();
			CA(x,y,z%P);
		}
		if(op==2){
			int x=rd(),y=rd();
			wrt(CQ(x,y));pc('\n');
		}
		if(op==3){
			int x=rd(),z=rd();
			TA(x,z%P);
		}
		if(op==4){
			int x=rd();
			wrt(TQ(x));pc('\n');
		}
	}
}


2021/11/19 20:49
加载中...