树剖代码80pts求调
查看原帖
树剖代码80pts求调
935908
zengziqvan楼主2024/6/6 10:40

T 了#7和#8

#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define int long long
//#define double long double
#define FOR(i,l,r) for(int i=l;i<=r;++i)
#define ROF(i,r,l) for(int i=r;i>=l;--i)
#define mkp make_pair
#define fr first
#define se second
#define pb push_back
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
using namespace std;
const int N=3e4+10;
int n,q,fa[N],tot,top[N],dep[N],siz[N],son[N],id[N],a[N],b[N];
vector<int>e[N];
void dfs1(int x,int fat) {
	fa[x]=fat;siz[x]=1;dep[x]=dep[fat]+1;
	for(int y:e[x]) {
		if(y==fat) continue;
		dfs1(y,x);
		siz[y]+=siz[x];
		if(siz[son[x]]<siz[y]) son[x]=y; 
	}
}
void dfs2(int x,int tp) {
	id[x]=++tot;a[tot]=b[x];top[x]=tp;
	if(!son[x]) return ;
	dfs2(son[x],tp);
	for(int y:e[x]) {
		if(y==son[x]||y==fa[x]) continue;
		dfs2(y,y);
	}
}
struct SegmentTree {
	int l,r;
	int sum,Max;
}t[N<<2];
void push_up(int p) {
	t[p].Max=max(t[p<<1].Max,t[p<<1|1].Max);
	t[p].sum=t[p<<1].sum+t[p<<1|1].sum;
}
void Build(int p,int l,int r) {
	t[p].l=l,t[p].r=r;
	if(l==r) return (void)(t[p].sum=t[p].Max=a[l]);
	int mid=l+r>>1;
	Build(p<<1,l,mid);
	Build(p<<1|1,mid+1,r);
	push_up(p); 
}
void change(int p,int x,int v) {
	if(t[p].l==t[p].r) return (void)(t[p].sum=t[p].Max=v);
	int mid=t[p].l+t[p].r>>1;
	if(x<=mid) change(p<<1,x,v);
	else change(p<<1|1,x,v);
	push_up(p); 
}
int ask(int p,int l,int r) {
	if(l<=t[p].l&&t[p].r<=r) return t[p].sum;
	int mid=t[p].l+t[p].r>>1,val=0;
	if(l<=mid) val+=ask(p<<1,l,r);
	if(r>mid) val+=ask(p<<1|1,l,r);
	return val;
}
int askq(int p,int l,int r) {
	if(l<=t[p].l&&t[p].r<=r) return t[p].Max;
	int mid=t[p].l+t[p].r>>1,val=-1e18;
	if(l<=mid) cmax(val,askq(p<<1,l,r));
	if(r>mid) cmax(val,askq(p<<1|1,l,r));
	return val;
}
int Tree_Max(int x,int y) {
	int ans=-1e18;
	while(top[x]!=top[y]) {
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		cmax(ans,askq(1,id[top[x]],id[x]));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	cmax(ans,askq(1,id[x],id[y]));
	return ans;
}
int Tree_sum(int x,int y) {
	int ans=0;
	while(top[x]!=top[y]) {
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans+=ask(1,id[top[x]],id[x]);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	ans+=ask(1,id[x],id[y]);
	return ans;
}
main() {
	cin>>n;
	FOR(i,1,n-1) {
		int u,v;
		scanf("%lld%lld",&u,&v);
		e[u].pb(v),e[v].pb(u);
	}
	FOR(i,1,n) scanf("%lld",&b[i]);
	dfs1(1,0),dfs2(1,1);
	Build(1,1,n);
	cin>>q;
	while(q--) {
		char s[10];int u,v;
		scanf("%s%lld%lld",s,&u,&v);
		if(s[0]=='C') change(1,id[u],v);
		if(s[1]=='M') printf("%lld\n",Tree_Max(u,v));
		if(s[1]=='S') printf("%lld\n",Tree_sum(u,v));
	}
	return 0;
}
2024/6/6 10:40
加载中...