树剖模板求调玄关
查看原帖
树剖模板求调玄关
1328579
mairuisheng楼主2025/6/30 14:03

样例1 RE,求调。

//Author : mairuisheng
//#pragma GCC optimize(3)
#include<iostream>
#include<vector>
using namespace std;
inline int read()
{
	int x=0,f=1;
	char s;
	s=getchar();
	while(s<48||s>57)
	{
		if(s=='-')f=-f;
		s=getchar();
	}
	while(s>47&&s<58)
	{
		x=(x<<3)+(x<<1)+(s-48);
		s=getchar();
	}
	return x*f;
}
constexpr int N=3e4+1;
int n,q;
vector<int> g[N];
int fat[N],son[N],sz[N],top[N],dep[N],seg[N<<2],rev[N<<2];
int mx[N<<2],sum[N<<2];
int a[N];
int ansmx,anssum;
void dfs(int u,int fa)
{
	fat[u]=fa;
	sz[u]=1;
	dep[u]=dep[fa]+1;
	for(auto v:g[u])
	{
		if(v==fa)continue;
		dfs(v,u);
		sz[u]+=sz[v];
		if(sz[v]>sz[son[u]])son[u]=v;
	}
}
void dfs2(int u)
{
	if(!son[u])return;
	seg[son[u]]=++seg[0];
	rev[seg[0]]=son[u];
	top[son[u]]=top[u];
	dfs2(son[u]);
	for(auto v:g[u])
	{
		if(v==fat[u]||v==son[u])continue;
		seg[v]=++seg[0];
		rev[seg[0]]=v;
		top[v]=v;
		dfs2(v);
	}
}
void Build(int x,int l,int r)
{
	if(l==r)
	{
		sum[x]=mx[x]=a[rev[l]];
		return;
	}
	int mid=l+r>>1;
	Build(x<<1,l,mid);
	Build(x<<1|1,mid+1,r);
	sum[x]=sum[x<<1]+sum[x<<1|1];
	mx[x]=max(mx[x<<1],mx[x<<1|1]);
}
void Change(int x,int l,int r,int v,int pos)
{
	if(l==r&&l==pos)
	{
		sum[x]=mx[x]=a[rev[pos]]=v;
		return;
	}
	int mid=l+r>>1;
	if(mid>=pos)Change(x<<1,l,mid,v,pos);
	if(mid<pos)Change(x<<1|1,mid+1,r,v,pos);
	sum[x]=sum[x<<1]+sum[x<<1|1];
	mx[x]=max(mx[x<<1],mx[x<<1|1]);
}
inline void Query(int x,int l,int r,int ql,int qr)
{
	if(ql<=l&&r<=qr)
	{
		ansmx=max(ansmx,mx[x]);
		anssum+=sum[x];
		return;
	}
	int mid=l+r>>1;
	if(l<=mid)Query(x<<1,l,mid,ql,qr);
	if(mid<r)Query(x<<1|1,mid+1,r,ql,qr);
}
void Ask(int u,int v)
{
	int fu=top[u],fv=top[v];
	while(fu!=fv)
	{
		if(dep[fu]<dep[fv])
		{
			swap(fu,fv);
			swap(u,v);
		}
		Query(1,1,seg[0],seg[fu],seg[u]);
		u=fat[fu];
		fu=top[u];
	}
	if(dep[u]<dep[v])swap(u,v);
	Query(1,1,seg[0],seg[v],seg[u]);
}
int main()
{
	n=read();
	int i,u,v;
	for(i=1;i<n;++i)
	{
		u=read();
		v=read();
		g[u].push_back(v);
		g[v].push_back(u);
	}
	for(i=1;i<=n;++i)a[i]=read();
	dfs(1,0);
	seg[0]=seg[1]=top[1]=rev[1]=1;
	dfs2(1);
	Build(1,1,seg[0]);
	q=read();
	string s;
	while(q--)
	{
		cin>>s;
		u=read();
		v=read();
		if(s[0]=='C')Change(1,1,seg[0],v,seg[u]);
		else
		{
			anssum=0;
			ansmx=-N;
			Ask(u,v);
			if(s[1]=='M')printf("%d\n",ansmx);
			else printf("%d\n",anssum);
		}
	}
	return 0;
}
2025/6/30 14:03
加载中...