树剖,WA第三个测试点,其他的都AC了,求助
查看原帖
树剖,WA第三个测试点,其他的都AC了,求助
472169
liuxiangbin楼主2021/11/4 20:13
#include<bits/stdc++.h>
#define int long long
//#define endl '\n'
using namespace std;

int cnt=1,inf=1e9;
const int maxn=3e4+10;
int fa[maxn],deep[maxn],rk[maxn],id[maxn];
int son[maxn],sz[maxn],tp[maxn],a[maxn];
vector<int>v[maxn];
int sum[maxn<<2],mx[maxn<<2];

void build(int rt,int l,int r)
{
	int mid=(l+r)>>1;
	if(l==r) 
	{
		mx[rt]=sum[rt]=a[l];
		return;
	}
	build(rt*2,l,mid);
	build(rt*2+1,mid+1,r);
	sum[rt]=sum[rt*2]+sum[rt*2+1];
	mx[rt]=max(mx[rt*2],mx[rt*2+1]);
} 

int query_sum(int rt,int L,int R,int l,int r)
{
	if(L>=l&&R<=r) return sum[rt];
	if(L>r||R<l) return 0;
	int mid=(L+R)>>1;
	return 	query_sum(rt*2,L,mid,l,r)+query_sum(rt*2+1,mid+1,R,l,r);
}
int query_mx(int rt,int L,int R,int l,int r)
{
	if(L>=l&&R<=r) return mx[rt];
	if(L>r||R<l) return -inf;
	int mid=(L+R)>>1;
	return 	max(query_mx(rt*2,L,mid,l,r),query_mx(rt*2+1,mid+1,R,l,r));
}

void update(int rt,int L,int R,int pos)
{
	if(L==R) 
	{	
		mx[rt]=sum[rt]=a[pos];
		return;
	}
	int  mid=(L+R)>>1;
	if(pos>mid) update(rt*2+1,mid+1,R,pos);
	else update(rt*2,L,mid,pos);
	sum[rt]=sum[rt*2]+sum[rt*2+1];
	mx[rt]=max(mx[rt*2],mx[rt*2+1]);
}
void dfs1(int x,int f){
	deep[x]=deep[f]+1;
	fa[x]=f;
	sz[x]=1;
	for(int i:v[x]){
		if(i==f) continue;
		dfs1(i,x);
		sz[x]+=sz[i];
		if(sz[son[x]]<sz[i]) son[x]=i;
	}
}

void dfs2(int x,int t){
	tp[x]=t;
	rk[x]=cnt;
	id[cnt++]=x;
	if(son[x]) dfs2(son[x],t);
	for(int i:v[x]){
		if(i==fa[x]||i==son[x]) continue;
		dfs2(i,i);
	}
}

int lca(int x,int y){
	while(tp[x]!=tp[y])
	{
		if(deep[tp[x]]>=deep[tp[y]])
			x=fa[tp[x]];
		else
			y=fa[tp[y]];
	}
	return x<y?x:y;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n,q,x,y,z;cin>>n;
	string op;
	for(int i=1;i<n;i++){
		cin>>x>>y;
		v[x].push_back(y);
		v[y].push_back(x);
	}
	dfs1(1,0);
	dfs2(1,1);
	for(int i=1;i<=n;i++){
		cin>>a[rk[i]];
	}
	build(1,1,n);
	cin>>q;
	while(q--){
		cin>>op>>x>>y;
		if(op[1]=='M')
		{
			z=lca(x,y);
			int ans=-inf;
			while(true)
			{
				if(tp[x]==tp[z])
				{
					ans=max(query_mx(1,1,n,rk[z],rk[x]),ans);
					break;
				}
				ans=max(query_mx(1,1,n,rk[tp[x]],rk[x]),ans);
				x=fa[tp[x]];
			}
			while(true)
			{
				if(tp[y]==tp[z])
				{
					ans=max(query_mx(1,1,n,rk[z],rk[y]),ans);
					break;
				}
				ans=max(query_mx(1,1,n,rk[tp[y]],rk[y]),ans);
				y=fa[tp[y]];
			}
			cout<<ans<<endl;
		}
		else if(op[1]=='S')
		{
			z=lca(x,y);
			int ans=0;
			while(true)
			{
				if(tp[x]==tp[z])
				{
					ans+=query_sum(1,1,n,rk[z],rk[x]);
					break;
				}
				ans+=query_sum(1,1,n,rk[tp[x]],rk[x]);
				x=fa[tp[x]];
			}
			while(true)
			{
				if(tp[y]==tp[z])
				{
					ans+=query_sum(1,1,n,rk[z],rk[y]);
					break;
				}
				ans+=query_sum(1,1,n,rk[tp[y]],rk[y]);
				y=fa[tp[y]];
			}
			ans-=a[rk[z]];
			cout<<ans<<endl;	
		}
		else if(op[1]=='H')
		{
			a[rk[x]]=y;
			update(1,1,n,rk[x]);			
		}
	}
	return 0;
}
2021/11/4 20:13
加载中...