求调
查看原帖
求调
297690
sunweichen1楼主2024/3/27 20:29
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
long long n,m,r,p;
long long a[N],f[N],sz[N],d[N],hson[N],dfn[N],top[N],tot=0,b[N];
long long tree[N<<2]={},tree1[N<<2]={};
vector <int> adj[N];
void build(int x,int l,int r){
	if(l==r){
        tree[x]=b[l];
        tree1[x]=b[l];
    }
	else{
		long long m=(l+r)>>1;
		build(x+x,l,m);
		build(x+x+1,m+1,r);
		tree[x]=(tree[x+x]+tree[x+x+1]);
        tree1[x]=max(tree1[x+x],tree1[x+x+1]);
	}
}
void modify(int x,long l,int r,int le,int c){
	if(l==r){
        tree[x]=c;
        tree1[x]=c;
	}
	else{
        int m=(l+r)>>1;
		if(le<=m) modify(x+x,l,m,le,c);
		else if(le>m) modify(x+x+1,m+1,r,le,c);
		tree[x]=tree[x+x]+tree[x+x+1];
		tree1[x]=max(tree1[x+x],tree1[x+x+1]);
	}
    return;
}
long long query(int x,int l,int r,int le,int ri){
	if(le>ri) swap(le,ri);
	if(l==r){
		return tree[x];
	}
	else{
		long long m=(l+r)/2;
		if(ri<=m) return query(x+x,l,m,le,ri);
		else if(le>m) return query(x+x+1,m+1,r,le,ri);
		else return (query(x+x,l,m,le,m)+query(x+x+1,m+1,r,m+1,ri));
	}
}
long long query1(int x,int l,int r,int le,int ri){
	if(le>ri) swap(le,ri);
	if(l==r){
		return tree1[x];
	}
	else{
		long long m=(l+r)/2;
		if(ri<=m) return query1(x+x,l,m,le,ri);
		else if(le>m) return query1(x+x+1,m+1,r,le,ri);
		else return max(query1(x+x,l,m,le,m),query1(x+x+1,m+1,r,m+1,ri));
	}
}
long long LCA1(int x,int y){
	long long tot=-5e4;
	while(top[x]!=top[y]){
		if(d[top[x]]>=d[top[y]]){
			tot=max(tot,query1(1,1,n,dfn[top[x]],dfn[x]));
			x=f[top[x]];
		}
		else{
			tot=max(tot,query1(1,1,n,dfn[top[x]],dfn[x]));
			y=f[top[y]];
		}
	}
	if(dfn[x]>dfn[y]) swap(x,y);
	tot=max(tot,query1(1,1,n,dfn[x],dfn[y]));
	return tot;
}
long long LCA(int x,int y){
	long long tot=0;
	while(top[x]!=top[y]){
		if(d[top[x]]>=d[top[y]]){
			tot+=query(1,1,n,dfn[top[x]],dfn[x]);
			x=f[top[x]];
		}
		else{
			tot+=query(1,1,n,dfn[top[y]],dfn[y]);
			y=f[top[y]];
		}
	}
	if(dfn[x]>dfn[y]) swap(x,y);
	tot+=query(1,1,n,dfn[x],dfn[y]);
	return tot;
}
void dfs(int u,int fa){
	sz[u]=1;
	for(int i=0;i<adj[u].size();i++){
		int v=adj[u][i];
		if(v!=fa){
			d[v]=d[u]+1;
			f[v]=u;
			dfs(v,u);
			sz[u]+=sz[v];
			if(sz[hson[u]]<sz[v]) hson[u]=v;
		}
	}
    return;
}
void dfs1(int u,int t){
	tot++;
	dfn[u]=tot;
	top[u]=t;
	b[tot]=a[u];
	if(!hson[u]){
		return;
	}
	dfs1(hson[u],t);
	for(int i=0;i<adj[u].size();i++){
		int v=adj[u][i];
		if(v!=f[u]&&v!=hson[u]){
			dfs1(v,v);
		}
	}
    return;
}
int main(){
	scanf("%lld",&n);
	for(int i=1;i<n;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	scanf("%lld",&m);
	dfs(1,0);
	dfs1(1,1);
	build(1,1,n);
	for(int i=1;i<=m;i++){
		string op;
		long long x,y;
		cin>>op;
		scanf("%lld%lld",&x,&y);
		if(op[0]=='C'){
			modify(1,1,n,dfn[x],y);
		}
		else if(op[1]=='S'){
			cout<<LCA(x,y)<<endl;
		}
		else{
			cout<<LCA1(x,y)<<endl;
		}
	}
	return 0;
}
2024/3/27 20:29
加载中...