蒟蒻求助,样例WA了
查看原帖
蒟蒻求助,样例WA了
102369
liuxingyao楼主2020/8/6 18:31
#include <bits/stdc++.h>
using namespace std;
const int maxn=30001;
int summ,f[maxn],d[maxn],size[maxn],id[maxn],first[maxn]
,to[maxn],nxt[maxn],tot,son[maxn],top[maxn],rk[maxn],arr[maxn],n,m,q,r;
struct t
{
	int add,val;
}tre[maxn];
void up(int k)
{
	if(tre[k].add!=0)
	{
		tre[k*2].add+=tre[k].add;
		tre[k*2].val+=tre[k].add;
		tre[k*2+1].add+=tre[k].add;
		tre[k*2+1].val+=tre[k].add;
		tre[k].add=0;
	}
}
int read()
{
	int x=0,w=1;
	char c;
	for(;c<'0'||c>'9';c=getchar())
	{
		if(c=='-')
		w=-1;
	}
	for(;c>='0'&&c<='9';c=getchar())
	{
		x=x*10+c-'0';
	}
	return x*w;
}
void add(int u,int v)
{
	tot++;
	nxt[tot]=first[u];
	first[u]=tot;
	to[tot]=v;
}
void dfs1(int u,int fa)
{
	d[u]=d[fa]+1;
	f[u]=fa;
	size[u]=1;
	for(int e=first[u];e;e=nxt[e])
	{
		int v=to[e];
		if(v!=fa)
		{
			dfs1(v,u);
			size[u]+=size[v];
		   if(size[son[u]]<size[v])
			{
				son[u]=v;
			}
		}
	}
}
void dfs2(int u,int fa)
{
	if(son[u])
	{
		id[son[u]]=++id[0];
		top[son[u]]=top[u];
		rk[id[0]]=son[u];
		dfs2(son[u],u);
	}
	for(int e=first[u];e;e=nxt[e])
	{
		int v=to[e];
		if(!top[v])
		{
			top[v]=v;
			id[v]=++id[0];
			rk[id[0]]=v;
			dfs2(v,u);
		}
	}
}
void build(int k,int l,int r)
{
	if(l==r)
	{
		tre[k].val=arr[rk[l]];
		return;
	}
	int mid=(l+r)>>1;
	build(k<<1,l,mid);
	build((k<<1)+1,mid+1,r);
	tre[k].val=tre[k<<1].val+tre[(k<<1)+1].val;
}
void ch(int k,int l,int r,int x,int y,int val)
{
	if(r<x||l>y)
	return ;
	if(x<=l&&y>=r)
	{
		tre[k].val+=val;
		tre[k].add+=val;
		return;
	}
	up(k);
	int mid=(l+r)>>1;
	if(mid>=x)
	ch(k<<1,l,mid,x,y,val);
	if(mid+1<=y)
	ch((k<<1)+1,mid+1,r,x,y,val);
	tre[k].val=tre[k<<1].val+tre[(k<<1)+1].val;
}
void qf(int k,int l,int r,int a,int b)
{
	if(l>b||r<a)
	return;
	if(a<=l&&b>=r)
	{
		summ+=tre[k].val;
		return ;
	}
	up(k);
	int mid=(l+r)>>1;
	if(mid>=l)
	qf(k<<1,l,mid,a,b);
	if(mid+1<=r)
	qf((k<<1)+1,mid+1,r,a,b);
}
void ask(int u,int v)
{
	int fu=top[u],fv=top[v];
	while(fu!=fv)
	{
		if(d[fu]<d[fv])
		{
			swap(fu,fv);
			swap(u,v);
		}
		qf(1,1,id[0],id[fu],id[u]);
		u=f[fu];
		fu=top[u];
	}
	if(d[u]>d[v])
	swap(u,v);
	qf(1,1,id[0],id[u],id[v]);
}
int main()
{
	n=read(),m=read(),r=read(),q=read();
	int a,b,c,aa;
	for(int i=1;i<=n;i++)
	{
		arr[i]=read();
	}
	for(int i=1;i<n;i++)
	{
		a=read(),b=read();
		add(a,b);
		add(b,a);
	}
	dfs1(r,0);
	id[0]=1,id[r]=1,top[r]=r,rk[1]=r;
	dfs2(r,0);
	build(1,1,id[0]);
	for(int i=1;i<=m;i++)
	{
		aa=read();
		if(aa==1)
		{
			a=read(),b=read(),c=read();
			ch(1,1,id[0],id[a],id[b],c);
		}
		else if(aa==2)
		{	
		    summ=0;
		    a=read(),b=read();
			ask(a,b);
			cout<<summ<<endl;
		}
		else if(aa==3)
		{	
		    a=read(),b=read();
	   ch(1,1,id[0],id[a],id[a]+size[a]-1,b);
		}
		else
		{
			a=read();
			summ=0;
			ask(a,rk[id[a]+size[a]-1]);
			cout<<summ<<endl;
		}
	}
	return 0;
}
2020/8/6 18:31
加载中...