50pts树剖求调...
查看原帖
50pts树剖求调...
535758
_mumu楼主2024/9/12 14:07

我无语了,对着题解看就是找不出哪错了


#include <bits/stdc++.h>
using namespace std;

const int N=3e4+5;
int n,q,w[N];
struct Edge{
	int to,nxt;
}edge[N<<1];
int head[N],cnt_edge;
int fa[N],son[N],siz[N],depth[N],top[N],id[N],rk[N],cnt_id;
int tree1[N<<2],tree2[N<<2];

void add(int u,int v){
	edge[cnt_edge].to=v;
	edge[cnt_edge].nxt=head[u];
	head[u]=cnt_edge++;
}

void dfs1(int u,int f){
	fa[u]=f,siz[u]=1,depth[u]=depth[f]+1;
	for(int i=head[u];~i;i=edge[i].nxt){
		if(edge[i].to!=f){
			dfs1(edge[i].to,u);
			siz[u]+=siz[edge[i].to];
			if(!son[u] || siz[son[u]]<siz[edge[i].to]) son[u]=edge[i].to;
		}
	}
}

void dfs2(int u,int topu){
	top[u]=topu,id[u]=++cnt_id,rk[cnt_id]=u;
	if(son[u]) dfs2(son[u],topu);
	for(int i=head[u];~i;i=edge[i].nxt){
		if(edge[i].to!=fa[u] && edge[i].to!=son[u]){
			dfs2(edge[i].to,edge[i].to);
		}
	}
}

void build(int u,int l,int r){
	if(l==r){
		tree1[u]=w[rk[l]],tree2[u]=w[rk[l]];
		return;
	}
	int mid=(l+r)>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	tree1[u]=max(tree1[u<<1],tree1[u<<1|1]);
	tree2[u]=tree2[u<<1]+tree2[u<<1|1];
}

void update(int u,int l,int r,int x,int k){
	if(l==r && l==x){
		tree1[u]=k,tree2[u]=k;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid) update(u<<1,l,mid,x,k);
	else update(u<<1|1,mid+1,r,x,k);
	tree1[u]=max(tree1[u<<1],tree1[u<<1|1]);
	tree2[u]=tree2[u<<1]+tree2[u<<1|1];
}

int query1(int u,int l,int r,int L,int R){
	if(L<=l && r<=R) return tree1[u];
	int mid=(l+r)>>1,ans=-0x3f3f3f3f;
	if(L<=mid) ans=max(ans,query1(u<<1,l,mid,L,R));
	if(R>mid) ans=max(ans,query1(u<<1|1,mid+1,r,L,R));
	return ans;
}

int query2(int u,int l,int r,int L,int R){
	if(L<=l && r<=R) return tree2[u];
	int mid=(l+r)>>1,ans=0;
	if(L<=mid) ans+=query2(u<<1,l,mid,L,R);
	if(R>mid) ans+=query2(u<<1|1,mid+1,r,L,R);
	return ans;
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) head[i]=-1;
	int u,v;
	for(int i=1;i<n;i++){
		scanf("%d%d",&u,&v);
		add(u,v),add(v,u);
	}
	for(int i=1;i<=n;i++) scanf("%d",&w[i]);
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n);
	scanf("%d",&q);
	string op;
	while(q--){
		cin >> op;
		scanf("%d%d",&u,&v);
		if(op=="CHANGE") update(1,1,n,id[u],v);
		else if(op=="QMAX"){
			int ans=-0x3f3f3f3f;
			while(depth[top[u]]!=depth[top[v]]){
				if(depth[top[u]]<depth[top[v]]) swap(u,v);
				ans=max(ans,query1(1,1,n,id[top[u]],id[u]));
				u=fa[top[u]];
			}
			if(depth[u]>depth[v]) swap(u,v);
			ans=max(ans,query1(1,1,n,id[u],id[v]));
			printf("%d\n",ans);
		}
		else{
			int ans=0;
			while(depth[top[u]]!=depth[top[v]]){
				if(depth[top[u]]<depth[top[v]]) swap(u,v);
				ans+=query2(1,1,n,id[top[u]],id[u]);
				u=fa[top[u]];
			}
			if(depth[u]>depth[v]) swap(u,v);
			ans+=query2(1,1,n,id[u],id[v]);
			printf("%d\n",ans);
		}
	}
}
2024/9/12 14:07
加载中...