0pts求调
查看原帖
0pts求调
427590
SHENTONG_ZY楼主2024/8/11 17:44
#include<bits/stdc++.h>
using namespace std;
const int N=3e4+100;
int  n,cu,cv,idx=1,head[N],w[N],Q;
struct Edge{
	int to,next;
}e[N*2];
void add(int u,int v){
	e[idx].next=head[u];
	e[idx].to=v;
	head[u]=idx;
	idx++;
}
int fa[N],dep[N],sizet[N],maxs[N];
void dfs1(int now,int f){
	fa[now]=f;
	dep[now]=dep[f]+1;
	sizet[now]=1;
	int maxx=-1,maxson=0;
	for(int i=head[now];i;i=e[i].next){
		if(e[i].to==f) continue;
		dfs1(e[i].to,now);
		sizet[now]+=sizet[e[i].to];
		if(sizet[e[i].to]>maxx){
			maxx=sizet[e[i].to],maxson=e[i].to;
		}
	}
	maxs[now]=maxson;
}
int id[N],top[N],cnt,a[N];
void dfs2(int now,int f,int topp){
	top[now]=topp;
	id[now]=++cnt;
	a[id[now]]=w[now];
	if(!maxs[now]) return;
	dfs2(maxs[now],now,topp); 
	for(int i=head[now];i;i=e[i].next){
		if(e[i].to==f||e[i].to==maxs[now]) continue;
		dfs2(e[i].to,now,e[i].to);
	}
}
struct Tree{
	int sum,ma;
}t[4*N];
void build(int now,int l,int r){
	if(l==r){
		t[now].sum=a[l];
		t[now].ma=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(now*2,l,mid);
	build(now*2+1,mid+1,r);
	t[now].sum=t[now*2].sum+t[now*2+1].sum;
	t[now].ma=max(t[now*2].ma,t[now*2+1].ma);
}
void update(int now,int l,int r,int k,int x){
	if(l==r&&k==l){
		t[now].sum=x;
		t[now].ma=x;
		return;
	}
	int mid=(l+r)/2;
	if(k<=mid) update(now*2,l,mid,k,x);
	if(k>=mid+1) update(now*2+1,mid+1,r,k,x);
	t[now].sum=t[now*2].sum+t[now*2+1].sum;
	t[now].ma=max(t[now*2].ma,t[now*2+1].ma);
}
int qm(int now,int l,int r,int ml,int mr){
	if(ml<=l&&r<=mr) return t[now].ma;
	int mid=(l+r)/2,a1,a2;
	if(ml<=mid) a1=qm(now*2,l,mid,ml,mr);
	if(mr>=mid+1) a2=qm(now*2+1,mid+1,r,ml,mr);
	int ans=max(a1,a2);
	return ans;
}
int qs(int now,int l,int r,int ml,int mr){
	if(ml<=l&&r<=mr) return t[now].sum;
	int mid=(l+r)/2,s=0;
	if(ml<=mid) s+=qs(now*2,l,mid,ml,mr);
	if(mr>=mid+1) s+=qs(now*2+1,mid+1,r,ml,mr);
	return s;
}
int querym(int x,int y){
	int ans=-30000000;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans=max(ans,qm(1,1,n,id[top[x]],id[x]));
		x=fa[top[x]];
	}
	if(dep[x]<dep[y]) swap(x,y);
	ans=max(ans,qm(1,1,n,id[y],id[x]));
	return ans;
}
int querys(int x,int y){
	int sum=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		sum+=qs(1,1,n,id[top[x]],id[x]);
		x=fa[top[x]];
	}
	if(dep[x]<dep[y]) swap(x,y);
	sum+=qs(1,1,n,id[top[x]],id[x]);
	return sum;
}
int main(){
	cin>>n;
	for(int i=1;i<n;i++){
		scanf("%d%d",&cu,&cv);
		add(cu,cv);
		add(cv,cu);	
	}
	for(int i=1;i<=n;i++) scanf("%d",&w[i]);
	dfs1(1,0);
	dfs2(1,0,1);
	build(1,1,n);
	cin>>Q;
	string opt;
	int X,Y;
	while(Q--){
		cin>>opt;
		if(opt=="CHANGE"){
			scanf("%d%d",&X,&Y);
			update(1,1,n,id[X],Y);
		}
		if(opt=="QMAX"){
			scanf("%d%d",&X,&Y);
			printf("%d\n",querym(X,Y));
		}
		if(opt=="QSUM"){
			scanf("%d%d",&X,&Y);
			printf("%d\n",querys(X,Y));
		}
	}

	return 0;
} 
2024/8/11 17:44
加载中...