20pts求条
查看原帖
20pts求条
758200
_LDX_WWS_楼主2024/8/10 20:46
#include<bits/stdc++.h>
#define int long long
#define ls(x) x<<1
#define rs(x) x<<1|1
using namespace std;
const int N=3e4+100; 
int n,a[N],w[N];
int tot,head[N];
struct node{
	int to,nxt;
};
node E[N<<1];
void addedge(int u,int v){
	tot++;
	E[tot].nxt=head[u];
	E[tot].to=v;
	head[u]=tot;
}
//线段树
int tr1[N<<2],tr2[N<<2];
void pushup(int p){
	tr1[p]=tr1[ls(p)]+tr1[rs(p)];
	tr2[p]=max(tr2[ls(p)],tr2[rs(p)]);
} 
void build(int p,int l,int r){
	if(l==r){
		tr1[p]=w[l];
		tr2[p]=w[l];
		return;
	}
	int mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	pushup(p);
}
void update(int p,int l,int r,int x,int k){
	if(l==r){
		tr1[p]=k;
		tr2[p]=k;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid) update(ls(p),l,mid,x,k);
	if(x>mid) update(rs(p),mid+1,r,x,k);
	pushup(p);
}
int ask1(int p,int l,int r,int L,int R){
	if(L<=l&&r<=R){
		return tr1[p];
	}
	int mid=(l+r)>>1,res=0;
	if(L<=mid) res+=ask1(ls(p),l,mid,L,R);
	if(R>mid) res+=ask1(rs(p),mid+1,r,L,R);
	return res;
} 
int ask2(int p,int l,int r,int L,int R){
	if(L<=l&&r<=R){
		return tr2[p];
	}
	int mid=(l+r)>>1,res=-1e9;
	if(L<=mid) res=max(ask2(ls(p),l,mid,L,R),res);
	if(R>mid) res=max(ask2(rs(p),mid+1,r,L,R),res);
	return res;
}
//树链
int cnt,son[N],size[N],dfn[N],fa[N],top[N],dep[N];
int dfs1(int u,int f){
	size[u]++;
	fa[u]=f;
	dep[u]=dep[f]+1;
	int maxn=0,sum; 
	for(int i=head[u];i;i=E[i].nxt){
		int v=E[i].to;
		sum=0; 
		if(fa[u]!=v) sum=dfs1(v,u);
		size[u]+=sum;
		if(sum>maxn){
			son[u]=v;
			maxn=sum;
		}
	}
	return size[u];
} 
void dfs2(int u,int f,int tp){
	dfn[u]=++cnt;
	top[u]=tp;
	if(!son[u]) return;
	dfs2(son[u],u,tp);
	for(int i=head[u];i;i=E[i].nxt){
		int v=E[i].to;
		if(v!=f&&v!=son[u]) dfs2(v,u,v);	
	}
}
int m;
void change(int x,int k){
	update(1,1,n,dfn[x],k);
}
int qmax(int x,int y){
	int ans=-1e9;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans=max(ans,ask2(1,1,n,dfn[top[x]],dfn[x]));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	ans=max(ans,ask2(1,1,n,dfn[x],dfn[y])); 
	return ans;
}
int qsum(int x,int y){
	int ans=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans+=ask1(1,1,n,dfn[top[x]],dfn[x]);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	ans+=ask1(1,1,n,dfn[x],dfn[y]); 
	return ans;
}
signed main(){
	cin>>n;
	for(int i=1;i<n;i++){
		int x,y;
		cin>>x>>y;
		addedge(x,y);
		addedge(y,x);
	}
	for(int i=1;i<=n;i++) cin>>w[i];
	dfs1(1,0);
	dfs2(1,0,1);
	build(1,1,n);
	cin>>m;
	for(int i=1;i<=m;i++){
		string op;cin>>op;int x,y;
		if(op=="CHANGE"){
			cin>>x>>y;
			change(x,y);
		}
		if(op=="QMAX"){
			cin>>x>>y;
			cout<<qmax(x,y)<<endl;
		}
		if(op=="QSUM"){
			cin>>x>>y;
			cout<<qsum(x,y)<<endl;
		}
	}
	return 0;
}
2024/8/10 20:46
加载中...