MnZn求助树剖,30pts AC #5 #6 #9
查看原帖
MnZn求助树剖,30pts AC #5 #6 #9
308439
__mcx_楼主2022/12/3 11:52

RT

不知道哪里出了问题,求大佬指点

#include<bits/stdc++.h>
#define ll long long
#define lp (p<<1)
#define rp (p<<1|1)
#define mid ((l+r)>>1)
#define len (r-l+1)
#define re register
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=b;i>=a;i--)
#define up t[p].v=t[lp].v+t[rp].v,t[p].mx=m(t[lp].mx,t[rp].mx) 
using namespace std;
inline ll read(){
	ll w=1,s=0;char ch=getchar();
	while(ch<'0'||ch>'9') w=(ch=='-'?-1:1),ch=getchar();
	while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
	return w*s;
}
const int nn = 3e5+10;
const ll inf = 1e5;
struct node{
	ll son,fa,sz,w,top,id,dep;
}a[nn];
struct tree{
	ll v,mx;
}t[nn<<2];
struct edge{
	ll v,nt;
}e[nn<<1];
inline ll m(ll x,ll y){return x<y?y:x;}
ll n,x,y,op,T;
ll b[nn];
int h[nn],cnt;
string s;
inline void add(ll u,ll v){
	e[++cnt].v=v;
	e[cnt].nt=h[u];
	h[u]=cnt;
}
void dfs1(ll x){
	a[x].sz=1;a[x].dep=a[a[x].fa].dep+1;
	for(int i=h[x];i;i=e[i].nt){
		int y=e[i].v;
		if(y==a[x].fa) continue;
		a[y].fa=x;
		dfs1(y);
		a[x].sz+=a[y].sz;
		if(!a[x].son||a[a[x].son].sz<a[y].sz)
		a[x].son=y;
	}
} 
int cnt1;
void dfs2(ll x,ll f){
	a[x].top=f;
	a[x].id=++cnt1;
	b[cnt1]=a[x].w;
	if(a[x].son) 
//	return;
	dfs2(a[x].son,f);
	for(int i=h[x];i;i=e[i].nt){
		ll y=e[i].v;
		if(y==a[x].fa||y==a[x].son) continue;
		dfs2(y,y);
	}
}
void build(ll p,ll l,ll r){
	if(l==r)
	{
		t[p].v=t[p].mx=b[l];
		return;
	}
	build(lp,l,mid);
	build(rp,mid+1,r);
	up;
	return;
}
void modify(ll p,ll l,ll r,ll wh,ll v){
	if(l==r)
	{
		t[p].v=t[p].mx=v;
		return;
	}
	if(wh<=mid) modify(lp,l,mid,wh,v);
	else modify(rp,mid+1,r,wh,v);
	up;
	return;
}
tree query(ll p,ll l,ll r,ll L,ll R){
	if(L<=l&&r<=R) return t[p];
	tree res,res3;
	ll res1=0,res2=-inf;
	if(L<=mid) res3=query(lp,l,mid,L,R),res1+=res3.v,res2=m(res2,res3.mx);
	if(R>mid) res3=query(rp,mid+1,r,L,R),res1+=res3.v,res2=m(res2,res3.mx);
	res.mx=res2;res.v=res1;
	return res;
}
void work(){
	tree ans,res;
	ans.v=0;ans.mx=-inf;
	if(x>y) swap(x,y);
	while(a[x].top!=a[y].top){
		if(a[a[x].top].dep<a[a[y].top].dep) swap(x,y);
		res=query(1,1,n,a[a[x].top].id,a[x].id);
		ans.v+=res.v;ans.mx=m(ans.mx,res.mx);
		x=a[a[x].top].fa;
	}
	if(a[x].top>a[y].top) swap(x,y);
	res=query(1,1,n,a[x].id,a[y].id);
	ans.v+=res.v;ans.mx=m(ans.mx,res.mx);
	printf("%lld\n",(s[1]=='M'?ans.mx:ans.v));
}
int main()
{
	n=read();
	rep(i,1,n-1) x=read(),y=read(),add(x,y),add(y,x);
	rep(i,1,n) a[i].w=read();
	dfs1(1);
	dfs2(1,1);
	build(1,1,n);
	T=read();
	rep(i,1,T){
		cin>>s;x=read();y=read();
		if(s[0]=='C') modify(1,1,n,a[x].id,y);
		else work();
	}
	return 0;
}

2022/12/3 11:52
加载中...