只过5,6。求助
查看原帖
只过5,6。求助
182260
zero2005楼主2020/8/13 20:41
#include<bits/stdc++.h>
using namespace std;
const int mx=2000001;
#define int long long
int a[mx],d[mx],re[mx],f[mx],size[mx];
int son[mx],n,m,top[mx],summ,num=0,id[mx];
vector<int>ver[mx];
int edge[mx];
void add(int x,int y)
{
	ver[x].push_back(y);
	ver[y].push_back(x);
}
struct re
{
	long long sum;
	int l,r;
	long long maxn;
	#define sum(x) tree[x].sum
	#define l(x) tree[x].l
	#define r(x) tree[x].r
	#define mx(x) tree[x].maxn
}tree[mx*4];
void build(int p,int l,int r)
{
	l(p)=l;r(p)=r;
	if(l==r)
	{
		sum(p)=mx(p)=edge[re[l]];
		return;
	}
	int mid=(l+r)>>1;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	sum(p)=sum(p*2)+sum(p*2+1);
	mx(p)=max(mx(p*2),mx(p*2+1));
}
void change(int p,int x,int v){
	if(l(p)==r(p))
	{
		sum(p)=v;
		mx(p)=v;
		return ;
	}
	int mid=(l(p)+r(p))/2;
	if(x<=mid)change(p*2,x,v);
	else change(p*2+1,x,v);
	sum(p)=sum(p*2)+sum(p*2+1);
	mx(p)=max(mx(p*2),mx(p*2+1));
	
}
int ask1(int p,int l,int r)//sum
{
	if(l<=l(p)&&r>=r(p))
	{
		return sum(p);
	}
	int mid=(l(p)+r(p))>>1;
	int val=0;
	if(l<=mid)
	{
		val+=ask1(p*2,l,r);
	}
	if(r>mid)val+=ask1(p*2+1,l,r);
	return val;
}
int ask2(int p,int l,int r)//max
{
	if(l<=l(p)&&r>=r(p))
	{
		return mx(p);
	}
	int mid=(l(p)+r(p))>>1;
	int val=-999999999;
	if(l<=mid)
	{
		val=max(val,ask2(p*2,l,r));
	}
	if(r>mid)
	{
		val=max(val,ask2(p*2+1,l,r));
	}
	return val;
}
void dfs1(int x,int fa)
{
       f[x]=fa;size[x]=1;
       for(int i=0;i<ver[x].size();i++)
       {
       	int y=ver[x][i];
       	if(y==fa)continue;
       	d[y]=d[x]+1;
       	dfs1(y,x);
       	size[x]+=size[y];
       	if(size[y]>size[son[x]])son[x]=y;
	   }
}
void dfs2(int x,int t)
{
	top[x]=t;
	id[x]=++num;
	re[num]=x;
          if(!son[x])return;
	dfs2(son[x],t);
	for(int i=0;i<ver[x].size();i++)
	{
		int y=ver[x][i];
		if(y==f[x]||y==son[x])continue;
		dfs2(y,y);
	}
}
int qsum(int x,int y)
{
	int res=0;
	while(top[x]!=top[y])
	{
		if(d[top[x]]<d[top[y]])swap(x,y);	
		
			res+=ask1(1,id[top[x]],id[x]);
			x=f[top[x]];
	}
	if(d[x]>d[y])swap(x,y);
		res+=ask1(1,id[x],id[y]);
		return res;
}
int qmax(int x,int y)
{
	int res=-999999999;
	while(top[x]!=top[y])
	{
		if(d[top[x]]<d[top[y]])swap(x,y);
		res=max(res,ask2(1,id[top[x]],id[x]));
		x=f[top[x]];
	}
	if(d[x]>d[y])swap(x,y);
		res=ask2(1,id[x],id[y]);
		return res;
}
signed main()
{
	int a,b;
	cin>>n;
	for(int i=1;i<n;i++)
	{
		cin>>a>>b;
		add(a,b);
	}
	for(int i=1;i<=n;i++)
	{
		cin>>a;
		edge[i]=a;
	}
	d[1]=1;dfs1(1,0);
		dfs2(1,1);
	build (1,1,n);
	string s;int q;
	cin>>q;
	for(int i=1;i<=q;i++)
	{
		cin>>s>>a>>b;
		if(s=="QMAX")
		{
			cout<<qmax(a,b)<<endl;
		}
		if(s=="CHANGE")
		{
			change(1,id[a],b);
		}
		if(s=="QSUM")
		{
			cout<<qsum(a,b)<<endl;
		}
	}
	return 0;
}
2020/8/13 20:41
加载中...