萌新求助LCT死循环
查看原帖
萌新求助LCT死循环
158400
晴空一鹤楼主2023/8/21 12:00

RT,小数据没问题,但测试数据全T,下了#1发现死循环,但我看不出哪里会死循环,求大佬指出。

#include<bits/stdc++.h>
using namespace std;
int faa[200005],son[200005][2],dep[200005],siz[200005],n,m,xx,y,z,qq,x[200005];
int inline what(int x){
return x==son[faa[x]][1];}
void inline gxsz(int x){siz[x]=siz[son[x][0]]+siz[son[x][1]]+1;}
bool inline rt(int x){
	return x==son[faa[x]][0]||x==son[faa[x]][1];
}
void inline zig(int x){
	qq=faa[x];
	if(faa[qq]!=0){
	son[faa[qq]][what(qq)]=x;}
	faa[x]=faa[qq];
	faa[qq]=x;
	son[qq][0]=son[x][1];
	faa[son[x][1]]=qq; 
	son[x][1]=qq;
	gxsz(qq);
	gxsz(x);
}
void inline zag(int x){
	qq=faa[x];
	if(faa[qq]!=0){
	son[faa[qq]][what(qq)]=x;}
	faa[x]=faa[qq];
	faa[qq]=x;
	son[qq][1]=son[x][0];
	faa[son[x][0]]=qq; 
	son[x][0]=qq;
	gxsz(qq);
	gxsz(x);
}
void inline spj(int x){
	while(rt(x)){
		if(what(x)==what(faa[x])){
		if(what(x)==0){
			if(rt(faa[x]))
			zig(faa[x]);
			zig(x);
		}
		
		else{
			if(rt(faa[x]))
			zag(faa[x]);
			zag(x);
		}}
		else if(what(x)==0)zig(x);else zag(x);
	  
}}
int inline asa(int x){
	int q=0;
	while(x){
		spj(x);
		son[x][1]=q;
		faa[q]=x;//	for(int i=1;i<=n+1;i++)cout<<i<<" "<<faa[i]<<" "<<son[i][0]<<" "<<son[i][1]<<endl;
		gxsz(x);
	//	cout<<"opop"<<son[x][0]<<" "<<son[x][1]<<" "<<siz[son[x][0]]<<" "<<siz[son[x][1]]<<endl;
	//	cout<<x<<"hhh"<<siz[x]<<endl;		
		q=x;
		x=faa[x];
	}
	return q;
}
void inline link(int x,int y){
	faa[x]=y;
}
void inline cut(int x,int y){
	asa(x);spj(x);son[x][0]=0;faa[y]=0;gxsz(x);gxsz(y);
}
int main(){
	//freopen("1.txt","r",stdin);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x[i];
		if(i+x[i]<=n)
		faa[i]=i+x[i];
	}
	cin>>m;
	for(int i=1;i<=m;i++){
	//	cout<<"hhh"<<i<<endl;
		cin>>xx>>y;
		y++;
		if(xx==1)cout<<siz[asa(y)]<<endl;
		else{
			cin>>z;
			if(y+x[y]<=n)
			cut(y,y+x[y]);
			if(y+z<=n)
			link(y,y+z);
			else
			faa[y]=0;
			x[y]=z;
		}
	}
}
2023/8/21 12:00
加载中...