我也求助,哎呀,十分,,,
查看原帖
我也求助,哎呀,十分,,,
736891
Eternality楼主2022/11/5 20:57
#include<bits/stdc++.h>
using namespace std;

const int N=1e5+10,mod=(1<<31)-1;
int n,m,R,P;
int a[N];
int to[N<<1],nxt[N<<1],h[N],tot;
int fa[N],Size[N],hson[N],de[N];
int id[N],rk[N],top[N],idend[N];
int cnt;

struct T
{
	int l,r,sum,tag;
}t[N<<2];

void add(int x,int y)
{
	to[++tot]=y;
	nxt[tot]=h[x];
	h[x]=tot;
}

void dfs1(int x,int FA)
{
	fa[x]=FA;
	de[x]=de[FA]+1;
	Size[x]=1;
	int maxx=0,ans;
	for(int i=h[x];i;i=nxt[i])
	{
		int y=to[i];
		if(y==FA)continue;
		dfs1(y,x);
		Size[x]+=Size[y];
		if(Size[y]>maxx)
		{
			maxx=Size[y];
			hson[x]=y;
		}
	}
}

void dfs2(int x,int FA,int t)
{
	id[x]=++cnt;
	rk[cnt]=x;
	top[x]=t;
	if(hson[x])dfs2(hson[x],x,t);
	for(int i=h[x];i;i=nxt[i])
	{
		int y=to[i];
		if(y==FA||y==hson[x])continue;
		dfs2(y,x,y);
	}
	idend[x]=cnt;
}

T update(T &p,T ls,T rs)
{
	p.sum=ls.sum+rs.sum;
	return p;
}

void color(int p,int val)
{
	t[p].tag=(t[p].tag+val)%mod;
	t[p].sum=(t[p].sum+1ll*(t[p].r-t[p].l+1)*val)%mod;
}

void pushdown(int p)
{
	if(t[p].tag)
	{
		color(p<<1,t[p].tag);
		color(p<<1|1,t[p].tag);
		t[p].tag=0;
	}
}

void build(int p,int l,int r)
{
	t[p].l=l;
	t[p].r=r;
	if(l==r)
	{
		t[p].sum=a[rk[l]];
		return;
	}
	int mid=l+r>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	update(t[p],t[p<<1],t[p<<1|1]);
}

T ask(int p,int l,int r)
{
	if(l<=t[p].l&&r>=t[p].r)return t[p];
	T ans;
	pushdown(p);
	int mid=t[p].l+t[p].r>>1;
	if(l<=mid&&r>mid)return update(ans,ask(p<<1,l,r),ask(p<<1|1,l,r));
	if(r<=mid)return ask(p<<1,l,r);
	if(l>mid)return ask(p<<1|1,l,r);
}

void change(int p,int l,int r,int val)
{
	if(l<=t[p].l&&r>=t[p].r)
	{
		color(p,val);
		return;
	}
	pushdown(p);
	int mid=t[p].l+t[p].r>>1;
	if(l<=mid)change(p<<1,l,r,val);
	if(r>mid)change(p<<1|1,l,r,val);
	update(t[p],t[p<<1],t[p<<1|1]);
}

int _sum(int x,int y)
{
	int ans=0;
	if(de[x]>de[y])swap(x,y);
	while(top[x]!=top[y])
	{
		if(de[x]>de[y])swap(x,y);
		ans=(ans+ask(1,id[top[y]],id[y]).sum)%mod;
		y=fa[y];
	}
	if(de[x]>de[y])swap(x,y);
	ans=(ans+ask(1,id[x],id[y]).sum)%mod;
	return ans;
}

void _change(int x,int y,int val)
{
	if(de[x]>de[y])swap(x,y);
	while(top[x]!=top[y])
	{
		if(de[x]>de[y])swap(x,y);
		change(1,id[top[y]],id[y],val);
		y=fa[y];
	}
	if(de[x]>de[y])swap(x,y);
	change(1,id[x],id[y],val);
}

int main()
{
//	cout<<mod<<endl;
	scanf("%d%d%d%d",&n,&m,&R,&P);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(int i=1;i<n;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);
	}
	dfs1(R,0);
	dfs2(R,0,R);
	build(1,1,n);
//	cout<<"KKKKKK\n";
//	for(int i=1;i<=n;i++)
//	{
//		cout<<i<<" "<<id[i]<<" "<<idend[i]<<" "<<top[i]<<endl;
//	}
//	cout<<"KKKKKK\n";
	for(int i=1;i<=m;i++)
	{
		int op,x,y,z;
		scanf("%d",&op);
		if(op==1)
		{
			scanf("%d%d%d",&x,&y,&z);
			_change(x,y,z);
		}
		if(op==2)
		{
			scanf("%d%d",&x,&y);
			cout<<_sum(x,y)<<"\n";
		}
		if(op==3)
		{
			scanf("%d%d",&x,&y);
			change(1,id[x],idend[x],y);
		}
		if(op==4)
		{
			scanf("%d",&x);
			cout<<ask(1,id[x],idend[x]).sum<<"\n";
		}
	}
	return 0;
}
2022/11/5 20:57
加载中...