样例过了,但0分求调
查看原帖
样例过了,但0分求调
1127126
yueyan_WZF楼主2024/10/11 10:50
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000003;
struct node{
	int fa,maxxson,son,dep,top,num;
}l[N];
struct Node{
	int to,nxt;
}z[N];
struct mode{
	int l,r,sum,maxx;
}t[4*N];
int a[N];
int h[N];
int w[N];
int Num;
int root;
void dfs(int x,int fa){
	l[x].son=1;
	l[x].dep=l[fa].dep+1;
	l[x].fa=fa;
	l[l[x].maxxson].son=-1;
	for(int i=h[x];i;i=z[i].nxt){
		int y=z[i].to;
		if(y==fa) continue;
		else{
			dfs(y,x);
			l[x].son+=l[y].son;
			if(l[y].son>l[l[x].maxxson].son){
				l[x].maxxson=y;
				l[l[x].maxxson].son=l[y].son;
			}
		}
	}
}
void dfs1(int x,int fa,int Top){
	Num++;
	l[x].num=Num;
	l[x].top=Top;
	w[Num]=a[x];
	if(!l[x].maxxson) return ;
	else{
		dfs1(l[x].maxxson,x,Top);
	}
	for(int i=h[x];i;i=z[i].nxt){
		int y=z[i].to;
		if(y==fa||y==l[x].maxxson) continue;
		else{
			dfs1(y,x,y);
		}
	}
}
int n,q;
int cnt;
void add(int a,int b){
	cnt++;
	z[cnt].to=b;
	z[cnt].nxt=h[a];
	h[a]=cnt;
}
void chan(int x,int p,int k ){
	if(t[k].l==t[k].r){
		t[k].sum=p;
		t[k].maxx=p;
		return ;
	}
	int mid=t[k].l+t[k].r>>1;
	if(x<=mid){
		chan(x,p,k*2);
	}
	else{
		chan(x,p,k*2+1);
	}
	t[k].maxx=max(t[k*2].maxx,t[k*2+1].maxx);
	t[k].sum=t[k*2].sum+t[k*2+1].sum;
}
void build(int l,int r,int k){
	t[k].l=l;
	t[k].r=r;
	if(l==r){
		t[k].sum=w[l];
		t[k].maxx=w[l];
		return ;
	}
	int mid=l+r>>1;
	build(l,mid,k*2);
	build(mid+1,r,k*2+1);
	t[k].sum=t[k*2].sum+t[k*2+1].sum;
	t[k].maxx=max(t[k*2].maxx,t[k*2+1].maxx);
}
int query_tree(int l,int r,int k){
	if(t[k].l>=l&&t[k].r<=r){
		return t[k].maxx;
	}
	int mid=t[k].l+t[k].r>>1;
	int ans=-1;
	if(l<=mid) ans=query_tree(l,r,k*2);
	if(r>mid) ans=max(ans,query_tree(l,r,k*2+1));
	return ans;
}
int qury(int a,int b){
	int ans=-0x3f3f3f3f3f;
	while(l[a].top!=l[b].top){
		if(l[l[a].top].dep<l[l[b].top].dep){
			swap(a,b);
		}
		ans=max(ans,query_tree(l[l[a].top].num,l[a].num,1));
		a=l[l[a].top].fa;
	}
	if(l[a].dep>l[b].dep) swap(a,b);
	ans=max(ans,query_tree(l[a].num,l[b].num,1));
	return ans;
}
int quury_tree(int l,int r,int k){
	if(t[k].l>=l&&t[k].r<=r){
		return t[k].sum;
	}
	int mid=t[k].l+t[k].r>>1;
	int ans=0;
	if(l<=mid) ans+=quury_tree(l,r,k*2);
	if(r>mid) ans+=quury_tree(l,r,k*2+1);
	return ans;
}
int quury(int a,int b){
	int ans=0;
	while(l[a].top!=l[b].top){
		if(l[l[a].top].dep<l[l[b].top].dep){
			swap(a,b);
		}
		ans+=quury_tree(l[l[a].top].num,l[a].num,1);
		a=l[l[a].top].fa;
	}
	if(l[a].dep>l[b].dep) swap(a,b);
	ans+=quury_tree(l[a].num,l[b].num,1);
	return ans;
}
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<n;i++){
		int a,b;
		scanf("%lld%lld",&a,&b);
		add(a,b);
		add(b,a);
	}
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	scanf("%lld",&q);
	l[0].dep=0;
	dfs(1,0);
	dfs1(1,0,1);
	build(1,n,1);
	for(int i=1;i<=q;i++){
		string s;
		cin>>s;
		if(s=="CHANGE"){
			int u,t;
			scanf("%lld%lld",&u,&t);
			chan(u,t,1);
		}
		if(s=="QMAX"){
			int u,v;
			scanf("%lld%lld",&u,&v);
			int ans=qury(u,v);
			printf("%lld\n",ans);
		}
		if(s=="QSUM"){
			int u,v;
			scanf("%lld%lld",&u,&v);
			int ans=quury(u,v);
			printf("%lld\n",ans);
		}
	}
}
2024/10/11 10:50
加载中...