莫名RE
查看原帖
莫名RE
109220
Farkas_W楼主2021/2/24 09:03

调了很久调不出来

#include<iostream>
#include<cstdio>
#define root ch[0][1]
#define re register int
#define il inline
#define inf 1e9+5
using namespace std;
il int read()
{
  int x=0,f=1;char ch=getchar();
  while(!isdigit(ch)&&ch!='-')ch=getchar();
  if(ch=='-')f=-1,ch=getchar();
  while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
  return x*f;
}
il void print(int x)
{
  if(x<0)putchar('-'),x=-x;
  if(x/10)print(x/10);
  putchar(x%10+'0');
}
const int N=1e6+5;
int n,m,fa[N],ch[N][2],val[N],a[N],tot,sum[N];
bool vis[N];
il int identify(int x){return x==ch[fa[x]][1];}
il void connect(int x,int f,int son){fa[x]=f;ch[f][son]=x;}
il void update(int x){sum[x]=sum[ch[x][0]]+sum[ch[x][1]]+1;}
il int build(int l,int r,int f)
{
	if(l>r)return 0;
	int mid=l+r>>1,now=++tot;
	if(tot==1)root=now;
	fa[now]=f;
	sum[now]=1;
	val[now]=a[mid];
	ch[now][0]=build(l,mid-1,now);
	ch[now][1]=build(mid+1,r,now);
	update(now);
	return now;
}
il void pushdown(int x)
{
	if(!vis[x]||!x)return;
	vis[x]=0;
	swap(ch[x][1],ch[x][0]);
	vis[ch[x][0]]^=1;vis[ch[x][1]]^=1;
}
il int rotate(int x)
{
	int f=fa[x],g=fa[f],lx=identify(x),ly=identify(f),s=ch[x][lx^1];
	pushdown(g);pushdown(f);pushdown(x);
	connect(s,f,lx);connect(f,x,lx^1);connect(x,g,ly);
	update(f);update(x);
}
il void splay(int at,int to)
{
	to=fa[to];
	while(fa[at]!=to){
		int up=fa[at];
		if(fa[up]==to){rotate(at);return;}
		if(identify(at)==identify(up))rotate(up),rotate(at);
		else rotate(at),rotate(at);
	}
}
il int find(int x)
{
	int now=root;
	while(1){
		pushdown(now);int t=sum[ch[now][0]]+1;
		if(x<t)now=ch[now][0];
		else if(x==t){splay(now,root);return now;}
		else x-=t,now=ch[now][1];
	}
}
il void dfs(int x)
{
	pushdown(x);
	if(ch[x][0])dfs(ch[x][0]);
	if(val[x]<=n&&val[x]>0)print(val[x]),putchar(' ');
	if(ch[x][1])dfs(ch[x][1]);
}
signed main()
{
	n=read();m=read();
	for(re i=1;i<=n;i++)a[i+1]=i;
	a[1]=-inf;a[n+2]=inf;
	build(1,n+2,0);
	while(m--){
		int x=read()+1,y=read()+1;
		x=find(x-1);y=find(y+1);
		splay(x,root);splay(y,ch[root][1]);
		vis[ch[y][0]]^=1;
	}
	dfs(root);
	return 0;
}

测试点1的数据

本地调试没有RE

2021/2/24 09:03
加载中...