数据过水
查看原帖
数据过水
285617
黑影洞人楼主2022/8/21 20:48
#include<cstdio>
#include<algorithm>
#define N 1919810
#define lc p<<1
#define rc p<<1|1
using namespace std;
int n,q,head[N],to[N],nxt[N],a[N],w[N],tot,idx,id[N],top[N],siz[N],son[N],dep[N],f[N];
void add(int u,int v){
	to[++tot]=v;
	nxt[tot]=head[u];
	head[u]=tot;
}
struct Segement_tree{
	int l,r,val,mx;
}s[N*4];
void pushup(int p){
	s[p].val=s[lc].val+s[rc].val;
	s[p].mx=max(s[lc].mx,s[rc].mx);
}
void build(int p,int l,int r){
	s[p].l=l,s[p].r=r;
	if(l==r){
		s[p].val=s[p].mx=a[l];
		return;
	}
	build(lc,l,(l+r)/2);
	build(rc,(l+r)/2+1,r);
	pushup(p);
}
void change(int p,int x,int v){
	if(s[p].l>x||s[p].r<x)return;
	if(s[p].l==x&&s[p].r==x){
		s[p].val=s[p].mx=v;
		return;
	}
	change(lc,x,v);change(rc,x,v);
	pushup(p);
}
int qmax(int p,int l,int r){
	if(s[p].l>r||s[p].r<l)return -2147483647;
	if(s[p].l>=l&&s[p].r<=r)return s[p].mx;
	return max(qmax(lc,l,r),qmax(rc,l,r));
}
int qsum(int p,int l,int r){
	if(s[p].l>r||s[p].r<l)return 0;
	if(s[p].l>=l&&s[p].r<=r)return s[p].val;
	return qsum(lc,l,r)+qsum(rc,l,r);
}
void dfs1(int x,int fa){
	dep[x]=dep[fa]+1;f[x]=fa;siz[x]=1;
	int maxn=-1;
	for(int i=head[x];i;i=nxt[i]){
		int y=to[i];
		if(y==fa)continue;
		dfs1(y,x);
		siz[x]+=siz[y];
		if(maxn<siz[y])son[x]=y,maxn=siz[y];
	}
}
void dfs2(int x,int topx){
	id[x]=++idx;top[x]=topx;a[id[x]]=w[x];
	if(!son[x])return;
	dfs2(son[x],topx);
	for(int i=head[x];i;i=nxt[i]){
		int y=to[i];
		if(y==f[x]||y==son[x])continue;
		dfs2(y,y);
	}
}
int querymax(int x,int y){
	int res=-2147483647;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		res=max(res,qmax(1,id[top[x]],id[x]));
		x=f[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	return max(res,qmax(1,id[x],id[y]));
}
int querysum(int x,int y){
	int res=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		res+=qsum(1,id[top[x]],id[x]);
		x=f[top[x]];
	}
	if(dep[x]>=dep[y])swap(x,y);
	return res+qsum(1,id[x],id[y]);
}
signed main(){
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		add(a,b);add(b,a);
	}
	for(int i=1;i<=n;i++)scanf("%d",&w[i]);
	dfs1(1,0);dfs2(1,1);
	build(1,1,n);
	scanf("%d",&q);
	while(q--){
		char s[10];
		int a,b;
		scanf("%s%d%d",s,&a,&b);
		if(s[0]=='C'){
			change(1,id[a],b);
		}else if(s[0]=='Q'){
			if(s[1]=='M'){
				printf("%d\n",querymax(a,b));
			}else{
				printf("%d\n",querysum(a,b));
			}
		}
	}
	return 0;
}

我的DFS1里没有更新siz的值,但是获得了80分的好成绩

2022/8/21 20:48
加载中...