初学splay求助
查看原帖
初学splay求助
68703
_Int_楼主2021/11/12 09:02

爆零蒟蒻,在线卑微求助(虽然一般发求助贴没什么人帮忙TAT

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
inline void in(int &x){
	x=0;int f=1;char c=getchar();
	while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
	while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=getchar();
	x*=f;
}
const int N=100005;
int n,m,root,tot;
struct node{
	int fa,ch[2];
	int val,cnt,siz;
	int tag;
}a[N];
void Pushdown(int x){
	if(x&&a[x].tag){
		a[a[x].ch[0]].tag^=1;
		a[a[x].ch[1]].tag^=1;
		a[x].ch[0]^=a[x].ch[1]^=a[x].ch[0]^=a[x].ch[1];
		a[x].tag=0;
	}
}
void Update(int x){
	if(x){
		a[x].siz=a[x].cnt;
		if(a[x].ch[0])a[x].siz+=a[a[x].ch[0]].siz;
		if(a[x].ch[1])a[x].siz+=a[a[x].ch[1]].siz;
	}
}
void Rotate(int x){
	int fath=a[x].fa;
	int graf=a[fath].fa;
	Pushdown(x);
	Pushdown(fath);
	bool flag=(a[fath].ch[1]==x);
	a[graf].ch[a[graf].ch[1]==fath]=x;
	a[x].fa=graf;
	a[fath].ch[flag]=a[x].ch[flag^1];
	a[a[x].ch[flag^1]].fa=fath;
	a[x].ch[flag^1]=fath;
	a[fath].fa=x;
	Update(fath);
	Update(x); 
}
void Splay(int x,int t){
	while(a[x].fa!=t){
		int fath=a[x].fa;
		int graf=a[fath].fa;
		if(graf!=t)
			(a[graf].ch[0]==fath)^(a[fath].ch[0]==x)?Rotate(x):Rotate(fath);
		Rotate(x);
	}
	if(t==0)root=x;
}
void Find(int x){
	int u=root;
	if(!u)return;
	while(a[u].ch[x>a[u].val]&&a[u].val!=x){
		Pushdown(u);
		u=a[u].ch[x>a[u].val];
	}
	Splay(u,0); 
}
void Insert(int x){
	int u=root,fath=0;
	while(u&&a[u].val!=x){
		fath=u;
		u=a[u].ch[x>a[u].val];
	}
	if(u){
		a[u].cnt++;
		Update(u);
		Update(fath);
		Splay(u,0);
		return;
	}
	u=++tot;
	if(fath)
		a[fath].ch[x>a[fath].val]=u;
	a[u].ch[0]=a[u].ch[1]=0;
	a[u].fa=fath;
	a[u].val=x;
	a[u].cnt=1;
	a[u].siz=1;
	Splay(u,0);
}
int Find_pre_next(int x,int flag){
	Find(x);
	int u=root;
	if((a[u].val>x&&flag)||(a[u].val<x&&!flag))return u;
	u=a[u].ch[flag];
	while(a[u].ch[flag^1])
		u=a[u].ch[flag^1];
	return u;
}
void Delete(int x){
	int last=Find_pre_next(x,0);
	int next=Find_pre_next(x,1);
	Splay(last,0);
	Splay(next,last);
	int del=a[next].ch[0];
	if(a[del].cnt>1){
		a[del].cnt--;
		Splay(del,0);
	}
	else
		a[next].ch[0]=0;
}
int Find_rank(int x){
	int u=root,rnk=1;
	while(a[u].val!=x){
		if(x<a[u].val){
			u=a[u].ch[0];
			continue;
		}
		rnk+=a[a[u].ch[0]].siz+a[u].cnt;
		u=a[u].ch[1];
	}
	rnk+=a[a[u].ch[0]].siz;
	Splay(u,0);
	return rnk;
}
int Find_kth(int x){
	int u=root;
	if(a[u].siz<x||x<0)
		return 0;
	while(1){
		if(x>a[a[x].ch[0]].siz+a[u].cnt){
			x-=a[a[u].ch[0]].siz+a[u].cnt;
			u=a[u].ch[1];
		}
		else if(a[a[u].ch[0]].siz>=x)u=a[u].ch[0];
		else return a[u].val;
	}
}
void Reverse(int l,int r){
	int x=Find_kth(l),y=Find_kth(r+2);
	Splay(x,0);
	Splay(y,x);
	a[a[y].ch[0]].tag^=1;
}
void Output(int x){
	Pushdown(x);
	if(a[x].ch[0])Output(a[x].ch[0]);
	if(a[x].val>1&&a[x].val<n+2)printf("%d ",a[x].val-1);
	if(a[x].ch[1])Output(a[x].ch[1]);
}
int main(){
	in(n);in(m);
	for(int i=1;i<=n+2;i++)
		Insert(i); 
	while(m--){
		int l,r;
		in(l);in(r);
		Reverse(l,r); 
	}
	Output(root);
	return 0;
} 
2021/11/12 09:02
加载中...