萌新刚学OI,树剖求助
查看原帖
萌新刚学OI,树剖求助
108610
Dzhao楼主2020/8/12 17:33
#include<bits/stdc++.h>
using namespace std;
namespace IO
{
	bool f;char buf[20],c;int slen;
	template <typename T>
	inline void rd(T &x)
	{
		x=0;f=0;c=getchar();
		while(!isdigit(c)) {if(c=='-') f=1;c=getchar();}
		while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
		x=f?-x:x;
	}
	template <typename T>
	inline void wt(T x)
	{
		if(!x) putchar('0');if(x<0) x=-x,putchar('-');
		while(x) buf[++slen]=x%10+48,x/=10;
		while(slen) putchar(buf[slen--]);
	}
}
using IO::rd;
using IO::wt;
typedef long long ll;
const int N=2e5+5,M=2e5+5;
int n,m,rt,op,x,y,tot,h[N],nxt[M],ver[M];
inline void add(int x,int y) {ver[++tot]=y,nxt[tot]=h[x],h[x]=tot;}
int dep[N],son[N],w[N],wl[N],f[N],sz[N],id[N],ind,top[N];
ll tag[N<<2],tr[N<<2],P,z;
inline void push_down(int p,int ln,int rn)
{
	if(tag[p])
	{
		tag[p<<1]=(tag[p<<1]+tag[p])%P;
		tag[p<<1|1]=(tag[p<<1|1]+tag[p])%P;
		tr[p<<1]=(tr[p<<1]+tag[p]*ln)%P;
		tr[p<<1|1]=(tr[p<<1|1]+tag[p]*rn)%P;
		tag[p]=0;
	}
}
void build(int p,int l,int r)
{
	if(l==r)
	{
		tr[p]=w[l]%P;
		return;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	tr[p]=(tr[p<<1]+tr[p<<1|1])%P;
}
void modify(int p,int l,int r,int x,int y,ll z)
{
	if(l>=x && r<=y)
	{
		tr[p]=(tr[p]+z*(r-l+1))%P;
		tag[p]=(tag[p]+z)%P;
		return;
	}
	int mid=(l+r)>>1;
	push_down(p,mid-l+1,r-mid);
	if(mid>=x) modify(p<<1,l,mid,x,y,z);
	if(mid<y) modify(p<<1|1,mid+1,r,x,y,z);
	tr[p]=(tr[p<<1]+tr[p<<1|1])%P;
}
ll query(int p,int l,int r,int x,int y)
{
	if(l>=x && r<=y) return tr[p];
	int mid=(l+r)>>1;ll res=0;
	push_down(p,mid-l+1,r-mid);
	if(mid>=x) res=(res+query(p<<1,l,mid,x,y))%P;
	if(mid<y) res=(res+query(p<<1|1,mid+1,r,x,y))%P;
	return res;
}
inline ll qRange(int x,int y)
{
	ll res=0;
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		res=(res+query(1,1,n,id[top[x]],id[x]))%P;
		x=f[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	return (res+query(1,1,n,id[x],id[y]))%P;
}
inline void mRange(int x,int y,ll z)
{
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		modify(1,1,n,id[top[x]],id[x],z);
		x=f[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	modify(1,1,n,id[x],id[y],z);
}
inline int qSon(int x) {return query(1,1,n,id[x],id[x]+sz[x]-1);}
inline void mSon(int x,ll z) {modify(1,1,n,id[x],id[x]+sz[x]-1,z);}
void dfs1(int x,int fa)
{
	dep[x]=dep[fa]+1;
	f[x]=fa,sz[x]=1;
	for(int i=h[x];i;i=nxt[i])
	{
		int v=ver[i];
		if(v==fa) continue;
		dfs1(v,x);
		sz[x]+=sz[v];
		if(sz[v]>sz[son[x]]) son[x]=v;
	}
}
void dfs2(int x,int topf)
{
	id[x]=++ind;
	w[ind]=wl[x];
	top[x]=topf;
	if(!son[x]) return;
	dfs2(son[x],x);
	for(int i=h[x];i;i=nxt[i])
		if(ver[i]!=f[x] && ver[i]!=son[x]) dfs2(ver[i],ver[i]);
}

int main()
{
	rd(n),rd(m),rd(rt),rd(P);
	for(int i=1;i<=n;i++) rd(wl[i]);
	for(int i=1;i<n;i++)
	{
		rd(x),rd(y);
		add(x,y),add(y,x);
	}
	dfs1(rt,0);dfs2(rt,rt);build(1,1,n);
	while(m--)
	{
		rd(op),rd(x);
		if(op==1) rd(y),rd(z),mRange(x,y,z);
		else if(op==2) rd(y),wt(qRange(x,y)),putchar('\n');
		else if(op==3) rd(z),mSon(x,z);
		else wt(qSon(x)),putchar('\n');
	}
	return 0;
}

真的感觉莫名其妙不知道哪里写错了,1AC, 3TLE, 6WA。有没有大佬帮忙看一下qwq

2020/8/12 17:33
加载中...