萌新妹子刚学树剖 0.114514 s ,0分求调
查看原帖
萌新妹子刚学树剖 0.114514 s ,0分求调
524801
不食嗟来之食楼主2022/9/12 17:30
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
using namespace std;
const int N=3e4+5;
int n,m;
vector<int> e[N];
int tot[N],fa[N],dep[N],son[N],top[N],idx[N];
int a[N],b[N];
void dfs1(int now,int f,int deep)
{
	dep[now]=deep;
	fa[now]=f;
	tot[now]=1;
	for(auto v:e[now])
	{
		if(v==f) continue;
		else
		{
			dfs1(v,now,deep+1);
			tot[now]+=tot[v];
			if(tot[v]>tot[son[now]])
			{
				son[now]=v;
			}
		}
	}
	return ;
}
int pre[N],cnt;
void dfs2(int u,int TP)
{
	idx[u]=++cnt;
	pre[cnt]=u;
	top[u]=TP;
	if(son[u])
	{
		dfs2(son[u],TP);
	}
	for(auto v:e[u])
	{
		if(v==fa[u]||v==son[u]) continue;
		if(!idx[v])
		{
			dfs2(v,v);
		}
	}
	return ;
}
int q;
string str;
struct peo{
	int l,r,maxn,vals;
}t[N<<2];
#define lson k<<1
#define rson k<<1|1
void update(int k)
{
	t[k].maxn=max(t[lson].maxn,t[rson].maxn);
	t[k].vals=t[lson].vals+t[rson].vals;
	return ;
}
void build(int k,int l,int r)
{
	t[k].l=l,t[k].r=r;
	if(l==r)
	{
//		t[k].maxn=a[l];
//		t[k].vals=a[l];
		t[k].maxn=b[pre[l]];
		t[k].vals=b[pre[l]];
		return ;
	}
	int mid=(l+r)>>1;
	build(lson,l,mid);
	build(rson,mid+1,r);
	update(k);
}
void change(int k,int l,int r,int val)
{
	if(t[k].l==l&&t[k].r==r)
	{
		t[k].maxn=val;
		t[k].vals=val;
		return ;
	}
	int mid=(t[k].l+t[k].r)>>1;
	if(l<=mid)
	{
		change(lson,l,r,val);
	}
	if(r>mid)
	{
		change(rson,l,r,val);
	}
	update(k);
	return ;
}
int qrmax(int k,int l,int r)
{
	int ans=-1;
	if(t[k].l>=l&&t[k].r<=r)
	{
		return t[k].maxn;
	}
	int mid=(t[k].l+t[k].r)>>1;
	if(l<=mid)
	{
		ans=max(ans,qrmax(lson,l,r));
	}
	if(r>mid)
	{
		ans=max(ans,qrmax(rson,l,r));
	}
	update(k);
	return ans;
}
int qrsum(int k,int l,int r)
{
	int ans=0;
	if(t[k].l>=l&&t[k].r<=r)
	{
		return t[k].vals;
	}
	int mid=(t[k].l+t[k].r)>>1;
	if(l<=mid)
	{
		ans+=qrsum(lson,l,r);
	}
	if(r>mid)
	{
		ans+=qrsum(rson,l,r);
	}
	update(k);
	return ans;
}
int Qmax(int u,int v)
{
	int ans=-0x7ffffff;
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		ans=max(ans,qrmax(1,idx[top[u]],idx[u]));
		u=fa[top[u]];
	}
	if(dep[u]<dep[v]) swap(u,v);
	ans=max(ans,qrmax(1,idx[v],idx[u]));
	return ans;
}
int Qsum(int u,int v)
{
	int ans=0;
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		ans+=qrsum(1,idx[top[u]],idx[u]);
		u=fa[top[u]];
	}
	if(dep[u]<dep[v]) swap(u,v);
	ans+=qrsum(1,idx[v],idx[u]);
	return ans;
}
int main()
{
//	freopen("2590.cpp","r=",stdin);
	scanf("%d",&n);
	for(int i=1;i<=n-1;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		e[u].push_back(v);
		e[v].push_back(u);
	}
	for(int i=1;i<=n;i++) scanf("%d",&b[i]);
	fa[1]=1;
	dep[1]=1;
	dfs1(1,0,1);
	dfs2(1,1);
	build(1,1,n);
	scanf("%d",&q);
	for(int i=1;i<=q;i++)
	{
		cin>>str;
		if(str=="QMAX")
		{
			int u,v;
			scanf("%d%d",&u,&v);
			printf("%d\n",Qmax(u,v));
			continue;
		}
		if(str=="QSUM")
		{
			int u,v;
			scanf("%d%d",&u,&v);
			printf("%d\n",Qsum(u,v));
			continue;
		}
		if(str=="CHANGE")
		{
			int u,v;
			scanf("%d%d",&u,&v);
			change(1,u,u,v);
			continue;
		}
	}
	return 0;
}
2022/9/12 17:30
加载中...