玄关求调
查看原帖
玄关求调
786861
zzh_KM楼主2025/1/3 17:55

20pts,AC on #5,#6

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,a,b,q,u,t,v,cnt,head[200010],siz[200010],fa[200010],seg[200010],
rev[200010],son[200010],dep[200010],tp[200010],ax[200010],sum[200010],
maxx[200010],tra[200010];
string s;
struct node
{
	ll nxt,to;
}e[200010];
void add(ll u,ll v)
{
	e[++cnt].to=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
	return ;
}
ll read()
{
	ll s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		s=(s<<1)+(s<<3)+ch-'0';
		ch=getchar();
	}
	return s*w;
}
void write(ll x)
{
	if(x<0)
	{
		putchar('-');
		x=-x;
	}
	if(x<=9)putchar(x+'0');
	else write(x/10),putchar(x%10+'0');
	return ;
}
void dfs1(ll x,ll fat)
{
	dep[x]=dep[fat]+1;
	siz[x]=1;
	fa[x]=fat;
	for(int i=head[x];i;i=e[i].nxt)
	{
		if(e[i].to==fat)continue;
		dfs1(e[i].to,x);
		siz[x]+=siz[e[i].to];
		if(siz[e[i].to]>siz[son[x]])son[x]=e[i].to;
	}
	return ;
}
void dfs2(ll x,ll fat)
{
	if(son[x])
	{
		seg[son[x]]=++seg[0];
		rev[seg[0]]=son[x];
		tp[son[x]]=tp[x];
		dfs2(son[x],x);
	}
	for(int i=head[x];i;i=e[i].nxt)
	{
		if(e[i].to==fat||e[i].to==son[x])continue;
		dfs2(e[i].to,x);
		seg[e[i].to]=++seg[0];
		rev[seg[0]]=e[i].to;
		tp[e[i].to]=e[i].to;
	}
	return ;
}
void build(ll id,ll l,ll r)
{
	ll mid=(l+r)>>1;
	if(l==r)
	{
		sum[id]=ax[rev[l]];
		maxx[id]=ax[rev[l]];
		return ;
	}
	build(id*2,l,mid);
	build(id*2+1,mid+1,r);
	sum[id]=sum[id*2]+sum[id*2+1];
	maxx[id]=max(maxx[id*2],maxx[id*2+1]);
	return ;
}
void psd(ll id,ll l,ll r)
{
	if(tra[id]==-1e18)return ;
	ll mid=(l+r)>>1;
	tra[id*2]=tra[id];
	sum[id*2]=tra[id]*(mid-l+1);
	maxx[id*2]=tra[id];
	tra[id*2+1]=tra[id];
	sum[id*2+1]=tra[id]*(r-(mid+1)+1);
	maxx[id*2+1]=tra[id];
	tra[id]=-1e18;
	return ;
}
void upd(ll id,ll l,ll r,ll x,ll y,ll t)
{
	ll mid=(l+r)>>1;
	if(l>y||r<x)return ;
	if(l>=x&&r<=y)
	{
		tra[id]=t;
		sum[id]=t*(r-l+1);
		maxx[id]=t;
		return ;
	}
	psd(id,l,r);
	upd(id*2,l,mid,x,y,t);
	upd(id*2+1,mid+1,r,x,y,t);
	sum[id]=sum[id*2]+sum[id*2+1];
	maxx[id]=max(maxx[id*2],maxx[id*2+1]);
	return ;
}
ll qum(ll id,ll l,ll r,ll x,ll y)
{
	ll mid=(l+r)>>1;
	if(l>y||r<x)return -1e18;
	if(l>=x&&r<=y)return maxx[id];
	psd(id,l,r);
	return max(qum(id*2,l,mid,x,y),qum(id*2+1,mid+1,r,x,y));
}
ll qus(ll id,ll l,ll r,ll x,ll y)
{
	ll mid=(l+r)>>1;
	if(l>y||r<x)return 0;
	if(l>=x&&r<=y)return sum[id];
	psd(id,l,r);
	return qus(id*2,l,mid,x,y)+qus(id*2+1,mid+1,r,x,y);
}
ll qmax(ll id,ll u,ll v)
{
	ll ans=-1e18,tmp1=tp[u],tmp2=tp[v];
	while(tmp1!=tmp2)
	{
		if(dep[tmp1]<dep[tmp2])swap(u,v),swap(tmp1,tmp2);
		ans=max(ans,qum(1,1,seg[0],seg[tmp1],seg[u]));
		u=fa[tmp1];
		tmp1=tp[u];
		//cout<<"wda";
	}
	if(dep[u]>dep[v])swap(u,v);
	ans=max(ans,qum(1,1,seg[0],seg[u],seg[v]));
	return ans;
}
ll qsum(ll id,ll u,ll v)
{
	ll ans=0,tmp1=tp[u],tmp2=tp[v];
	while(tmp1!=tmp2)
	{
		if(dep[tmp1]<dep[tmp2])swap(u,v),swap(tmp1,tmp2);
		ans+=qus(1,1,seg[0],seg[tmp1],seg[u]);
		u=fa[tmp1];
		tmp1=tp[u];
	}
	if(dep[u]>dep[v])swap(u,v);
	ans+=qus(1,1,seg[0],seg[u],seg[v]);
	return ans;
}
int main()
{
	n=read();
	for(int i=1;i<=n-1;i++)
	{
		a=read();
		b=read();
		add(a,b);
		add(b,a);
	}
	for(int i=1;i<=n;i++)ax[i]=read();
	seg[1]=++seg[0];
	rev[seg[0]]=1;
	tp[1]=1;
	dfs1(1,0);
	dfs2(1,0);
	//cout<<"adw";
	build(1,1,seg[0]);
	for(int i=0;i<=200005;i++)tra[i]=-1e18;
	//for(int i=1;i<=10;i++)cout<<qus(1,1,seg[0],1,3)<<endl;
	q=read();
	for(int i=1;i<=q;i++)
	{
		cin>>s;
		if(s[1]=='H')
		{
			u=read();
			t=read();
			upd(1,1,seg[0],seg[u],seg[u],t);
		}
		if(s[1]=='M')
		{
			u=read();
			v=read();
			write(qmax(1,u,v));
			putchar('\n');
		}
		if(s[1]=='S')
		{
			u=read();
			v=read();
			write(qsum(1,u,v));
			putchar('\n');
		}
	}
	return 0;
}
2025/1/3 17:55
加载中...