TLE&&WA 求条
查看原帖
TLE&&WA 求条
790748
2022tysc0776楼主2024/6/7 12:23

rt

#include <bits/stdc++.h>
using namespace std;
#define lson x<<1
#define rson x<<1|1
struct Tree{
	int sum,maxx;
}tree[120010];
int siz[30010],fat[30010],dep[30010],son[30010],w[30010],top[30010],dfn[30010],tim;
int n,a[30010],Q,x,y;
vector<int> ed[30010];
char s[10];
void dfs1(int x){
	int len=ed[x].size(),heavy_son=-1;
	dep[x]=dep[fat[x]]+1;
	siz[x]=1;
	for(int i=0;i<len;i++){
		int v=ed[x][i];
		if(v==fat[x]) continue;
		fat[v]=x;
		dfs1(v); 
		if(siz[v]>heavy_son){
			heavy_son=siz[v];
			son[x]=v;
		}
	}
}
void dfs2(int x,int t){
	int len=ed[x].size();
	top[x]=t;	
	dfn[x]=++tim;
	w[tim]=a[x];
	if(!son[x]) return;
	dfs2(son[x],t);
	for(int i=0;i<len;i++){
		int v=ed[x][i];
		if(v==fat[x]||v==son[x]) continue;
		dfs2(v,v);
	}
}
void build_tree(int x,int l,int r){
	if(l==r){
		tree[x].sum=tree[x].maxx=w[l];
		return;
	}
	int mid=(l+r)>>1;
	build_tree(lson,l,mid);
	build_tree(rson,mid+1,r);
	tree[x].sum=tree[lson].sum+tree[rson].sum;
	tree[x].maxx=max(tree[lson].maxx,tree[rson].maxx);
}
void update(int x,int l,int r,int d,int v){
	if(l==r){
		tree[x].sum=tree[x].maxx=v;
		return;
	}
	int mid=(l+r)>>1;
	if(mid>=d) update(lson,l,mid,d,v);
	else update(rson,mid+1,r,d,v);
	tree[x].sum=tree[lson].sum+tree[rson].sum;
	tree[x].maxx=max(tree[lson].maxx,tree[rson].maxx);
}
Tree query(int x,int l,int r,int cl,int cr){
	if(cl<=l&&r<=cr) return tree[x];	
	int mid=(l+r)>>1;
	Tree res={-1,-1};
	if(mid>=cl) res=query(lson,l,mid,cl,cr);
	if(mid<cr){
		if(res.sum==-1) res=query(rson,mid+1,r,cl,cr);
		else{
			Tree ces=query(rson,mid+1,r,cl,cr);
			res.sum+=ces.sum;
			res.maxx=max(res.maxx,ces.maxx);
		}
	}
	return res;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		scanf("%d%d",&x,&y);
		ed[x].push_back(y);
		ed[y].push_back(x);
	} 
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	dfs1(1);
	dfs2(1,1);
	build_tree(1,1,n);
	scanf("%d",&Q);
	while(Q--){
		scanf("%s%d%d",s+1,&x,&y);
		if(s[1]=='C') update(1,1,n,dfn[x],y);
		else if(s[2]=='S'){
			int ans=0;
			while(top[x]!=top[y]){
				if(dep[top[x]]<dep[top[y]]) swap(x,y);
				Tree c=query(1,1,n,dfn[top[x]],dfn[x]);
				ans+=c.sum;
				x=fat[top[x]];
			}
			if(dep[x]>dep[y]) swap(x,y);
			Tree c=query(1,1,n,dfn[x],dfn[y]);
			ans+=c.sum;
			printf("%d\n",ans);
		}else{
			int ans=-1e9;
			while(top[x]!=top[y]){
				if(dep[top[x]]<dep[top[y]]) swap(x,y);
				Tree c=query(1,1,n,dfn[top[x]],dfn[x]);
				ans=max(ans,c.maxx);
				x=fat[top[x]]; 
			}
			if(dep[x]>dep[y]) swap(x,y);
			Tree c=query(1,1,n,dfn[x],dfn[y]);
			ans=max(ans,c.maxx);
			printf("%d\n",ans);
		}
	}
	return 0;
}
2024/6/7 12:23
加载中...