萌新刚学OI,20分树剖求助
查看原帖
萌新刚学OI,20分树剖求助
327813
__lyh__楼主2020/8/26 12:49

RT

只等过第5、6个点,其余全WA,死活调不出来QAQ。

#include<bits/stdc++.h>
#define int long long
#define M 300005
using namespace std;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return x*f;
}
inline int lc(int k){return (k<<1);}
inline int rc(int k){return (k<<1)+1;}
int top[M],size[M],dep[M],num[M],ba[M],son[M],seg[M],rev[4*M];
int ma[4*M],sum[4*M],n,q,tot,xx,yy,summ,mamm;
char al[10];
vector<int> e[M];
void getsize(int u)
{
	dep[u]=dep[ba[u]]+1;
	size[u]=1;
	int l=e[u].size();
	for(int i=0;i<l;i++)
	{
		int to=e[u][i];
		if(ba[u]==to) continue;
		ba[to]=u;
		getsize(to);
		size[u]+=size[to];
		if(!son[u]||size[to]>size[son[u]])
		{
			son[u]=to;
		}
	}
}
void dfs(int u,int fa)
{
	if(son[u])
	{
		seg[son[u]]=++tot;
		top[son[u]]=top[u];
		rev[tot]=son[u];
		dfs(son[u],u);
	}
	int l=e[u].size();
	for(int i=0;i<l;i++)
	{
		int to=e[u][i];
		if(top[to]) continue;
		seg[to]=++tot;
		top[to]=to;
		rev[tot]=to;
		dfs(to,u);
	}
}
void build(int k,int l,int r)
{
	if(l==r)
	{
		ma[k]=sum[k]=num[rev[l]];
		return;
	}
	int mid=(l+r)>>1;
	build(lc(k),l,mid);
	build(rc(k),mid+1,r);
	sum[k]=sum[lc(k)]+sum[rc(k)];
	ma[k]=max(ma[lc(k)],ma[rc(k)]);
}
void change(int k,int x,int y,int pos,int p)
{
	if(x>pos||y<pos) return;
	if(x==y&&x==pos)
	{
		sum[k]=p;
		ma[k]=p;
		return ;
	}
	int mid=(x+y)>>1;
	if(mid>=pos) change(lc(k),x,mid,pos,p);
	if(mid+1<=pos)change(rc(k),mid+1,y,pos,p);
	sum[k]=sum[lc(k)]+sum[rc(k)];
	ma[k]=max(ma[lc(k)],ma[rc(k)]);
}
void getsm(int k,int x,int y,int l,int r)
{
	if(x>r||y<l) return;
	if(x>=l&&y<=r)
	{
		summ+=sum[k];
		mamm=max(mamm,ma[k]);
		return;
	}
	int mid=(x+y)>>1;
	getsm(lc(k),x,mid,l,r);
	getsm(rc(k),mid+1,y,l,r);
}
void ask(int x,int y)
{
	while(top[x]!=top[y])
	{
		if(dep[top[x]]>dep[top[y]])
		{
			getsm(1,1,tot,seg[x],seg[top[x]]);
			x=ba[top[x]];
		}
		else
		{
			getsm(1,1,tot,seg[y],seg[top[y]]);
			y=ba[top[y]];
		}
	}
	if(dep[x]>dep[y]) swap(x,y);
	getsm(1,1,tot,seg[x],seg[y]);
}
signed main()
{
	n=read();
	for(int i=1;i<n;i++)
	{
		xx=read();yy=read();
		e[xx].push_back(yy);e[yy].push_back(xx);
	}
	for(int i=1;i<=n;i++)
	{
		num[i]=read();
	}
	getsize(1);
	tot=seg[1]=top[1]=rev[1]=1;
	dfs(1,0);
	build(1,1,tot);
	q=read();
	for(int i=1;i<=q;i++)
	{
		cin>>al;
		xx=read();yy=read();
		if(al[0]=='C')
		{
			change(1,1,tot,seg[xx],yy);
		}
		else
		{
			summ=0;mamm=-10000000;
			ask(xx,yy);
			if(al[1]=='M')
			{
				printf("%lld\n",mamm);
			}
			else
			{
				printf("%lld\n",summ);
			}
		}
	}
}
2020/8/26 12:49
加载中...