我真的找不出哪里错了QAQ树剖
查看原帖
我真的找不出哪里错了QAQ树剖
282080
RefreshinglyNaive楼主2020/8/18 21:14
#include <bits/stdc++.h>
#define maxn 200005
#define int long long
using namespace std;
int a[maxn],head[maxn],tot,cnt,son[maxn],n,w[maxn],b[maxn];
int dep[maxn],fa[maxn],size[maxn],lazy[maxn],top[maxn],id[maxn];
struct Edge{
	int to,nex;
}e[maxn];
void add(int x,int y){
	e[++tot].to=y;
	e[tot].nex=head[x];
	head[x]=tot;
}
void dfs1(int x,int fath,int depth){
	dep[x]=depth; fa[x]=fath; size[x]=1;
	int maxson=-1;
	for(int i=head[x];i;i=e[i].nex){
		int to=e[i].to;
		if(to==fath) continue;
		dfs1(to,x,depth+1);
		size[x]+=size[to];
		if(size[to]>maxson) maxson=size[to],son[x]=to;
	}
}
void dfs2(int x,int topx){
	top[x]=topx; id[x]=++cnt; w[cnt]=a[x];
	if(son[x]==0) return;
	dfs2(son[x],topx);
	for(int i=head[x];i;i=e[i].nex){
		int to=e[i].to;
		if(to==son[x]||to==fa[x]) continue;
		dfs2(to,to);
	}
}
void build(int l,int r,int rt){
	if(l==r){
		a[rt]=w[l]; b[rt]=a[rt];
		return;
	}
	int m=(l+r)>>1;
	build(l,m,rt<<1);
	build(m+1,r,rt<<1|1);
	a[rt]=a[rt<<1]+a[rt<<1|1];
	b[rt]=max(b[rt<<1],b[rt<<1|1]);
}
inline void updata(int x,int C,int l,int r,int rt){
	if(l==r){
		a[rt]=C; b[rt]=C;
		return;
	}
	int m=(l+r)>>1;
	if(x<=m) updata(x,C,l,m,rt<<1);
	if(x>m) updata(x,C,m+1,r,rt<<1|1);
	a[rt]=a[rt<<1]+a[rt<<1|1];
	b[rt]=max(b[rt<<1],b[rt<<1|1]);
}
inline int query_sum(int L,int R,int l,int r,int rt){
	if(L<=l&&r<=R) return a[rt];
	int m=(l+r)>>1;
	int ans=0;
	if(L<=m) ans+=query_sum(L,R,l,m,rt<<1);
	if(R>m) ans+=query_sum(L,R,m+1,r,rt<<1|1);
	return ans;
}
inline int query_max(int L,int R,int l,int r,int rt){
	if(L<=l&&r<=R) return b[rt];
	int m=(l+r)>>1;
	int ans=-0x3f3f3f3f;
	if(L<=m) ans=max(ans,query_max(L,R,l,m,rt<<1));
	if(R>m) ans=max(ans,query_max(L,R,m+1,r,rt<<1|1));
	return ans;
}
int qRange_sum(int x,int y){
	int ans=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans+=query_sum(id[top[x]],id[x],1,n,1);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	ans+=query_sum(id[x],id[y],1,n,1);
	return ans;
}
int qRange_max(int x,int y){
	int ans=-0x3f3f3f3f;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans=max(ans,query_max(id[top[x]],id[x],1,n,1));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	ans=max(ans,query_max(id[x],id[y],1,n,1));
	return ans;
}
signed main(){
	ios::sync_with_stdio(false); cin.tie(0);
	int q,x,y,C;
	while(cin>>n){
		memset(head,0,sizeof(head)); tot=0;
		memset(son,0,sizeof(son)); cnt=0;
		for(int i=1;i<n;i++){
			cin>>x>>y; 
			add(x,y); add(y,x);
		}
		for(int i=1;i<=n;i++) cin>>a[i];
		dfs1(1,0,1); dfs2(1,1); build(1,n,1);
		cin>>q;
		while(q--){
			string op;
			cin>>op;
			if(op=="CHANGE"){
				cin>>x>>C;
				updata(x,C,1,n,1);
			}
			if(op=="QMAX"){
				cin>>x>>y;	
				cout<<qRange_max(x,y)<<endl;
			}
			if(op=="QSUM"){
				cin>>x>>y;
				cout<<qRange_sum(x,y)<<endl;
			}
		}
	}
	return 0;
}
2020/8/18 21:14
加载中...