LCT 求助,怎么改都是 WA
查看原帖
LCT 求助,怎么改都是 WA
661044
_saltFish_楼主2022/8/12 13:39
#include<iostream>
using namespace std;
const int N(1e5+5);
int n,q;
int fa[N],ch[N][2],val[N],sum[N],stk[N],pre[N],lst[N],cha[N],ans[N],siz[N];
bool tag[N];
inline bool isroot(int x){
	return (ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x);
}
inline void pushup(int x){
	siz[x]=siz[ch[x][0]]+1+siz[ch[x][1]];
	sum[x]=sum[ch[x][0]]+val[x]+sum[ch[x][1]];
	pre[x]=max(pre[ch[x][0]],sum[ch[x][0]]+val[x]+pre[ch[x][1]]);
	lst[x]=max(lst[ch[x][1]],sum[ch[x][1]]+val[x]+lst[ch[x][0]]);
	ans[x]=max(lst[ch[x][0]]+val[x]+pre[ch[x][1]],max(ans[ch[x][0]],ans[ch[x][1]]));
}
inline void reverse(int x){
	swap(ch[x][0],ch[x][1]);swap(pre[x],lst[x]);tag[x]^=1;
}
inline void add(int x,int k){
	val[x]=cha[x]=k;
	sum[x]=siz[x]*k;
	if(k>0) pre[x]=lst[x]=ans[x]=sum[x];
	else pre[x]=lst[x]=ans[x]=0;
}
inline void pushdown(int x){
	if(-1e4<=cha[x]&&cha[x]<=1e4){
		if(ch[x][0]) add(ch[x][0],cha[x]);
		if(ch[x][1]) add(ch[x][1],cha[x]);
		cha[x]=0x7fffffff;
	}
	if(tag[x]){
		if(ch[x][0]) reverse(ch[x][0]);
		if(ch[x][1]) reverse(ch[x][1]);
		tag[x]=0;
	}
}
inline void rotate(int x){
	int y=fa[x],z=fa[y],k=(ch[y][1]==x);
	if(!isroot(y)) ch[z][ch[z][1]==y]=x;
	fa[x]=z;
	ch[y][k]=ch[x][k^1];
	if(ch[x][k^1]) fa[ch[x][k^1]];
	ch[x][k^1]=y;
	fa[y]=x;
	pushup(y);pushup(x);
}
inline void splay(int x){
	int y=x,z=0;
	stk[++z]=y;
	while(!isroot(y)) stk[++z]=y=fa[y];
	while(z) pushdown(stk[z--]);
	while(!isroot(x)){
		y=fa[x];z=fa[y];
		if(!isroot(y))
			rotate((ch[y][1]==x)^(ch[z][1]==y)?x:y);
		rotate(x);
	}
}
inline void access(int x){
	for(int y=0;x;x=fa[y=x])
		splay(x),ch[x][1]=y,pushup(x);
}
inline void makeroot(int x){
	access(x);splay(x);reverse(x);
}
inline void split(int x,int y){
	makeroot(x);
	access(y);splay(y);
}
inline void link(int x,int y){
	makeroot(x);fa[x]=y;
}
int main(){
	#ifdef ytxy
	freopen("in.txt","r",stdin);
	#endif
	ios::sync_with_stdio(0);
	cin.tie(),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>val[i];
		siz[i]=1;
		sum[i]=val[i];
		pre[i]=lst[i]=ans[i]=max(0,val[i]);
		cha[i]=0x7fffffff;
	}
	for(int i=1,u,v;i<n;i++){
		cin>>u>>v;
		link(u,v);
	}
	cin>>q;
	while(q--){
		int op,a,b,k;
		cin>>op>>a>>b;
		if(op==1){
			split(a,b);
			cout<<ans[b]<<'\n';
		}
		else if(op==2){
			cin>>k;
			split(a,b);
			add(b,k);
		}
	}
}

qwq

2022/8/12 13:39
加载中...