求助,splay,样例都没过……
查看原帖
求助,splay,样例都没过……
218999
啷里个浪楼主2021/6/28 11:37
//人类疑惑错误! 
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,rt,cnt,pos[N],fa[N],val[N],son[N][2],size[N];
bool flag[N];
struct node{
	int val,xh;
}a[N];
inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
void update(int x){
	size[x]=size[son[x][0]]+size[son[x][1]]+1;
}
void down(int x){
	if(!flag[x])return ;
	swap(son[x][0],son[x][1]);
	flag[son[x][0]]^=1;
	flag[son[x][1]]^=1;
	flag[x]=0;
}
void rotate(int x){
	int y=fa[x];
	int z=fa[y];
	down(y);down(x);
	int k=son[fa[x]][1]==x;
	son[y][k]=son[x][k^1];
	//if(son[x][k^1])
	fa[son[x][k^1]]=y;
	son[x][k^1]=y;
	fa[y]=x;
	fa[x]=z;
	if(z)son[z][y==son[fa[y]][1]]=x;
	update(y);
	update(x);
}
void splay(int x,int k){
	while(fa[x]!=k){
		int y=fa[x];
		int z=fa[y];
		if(z!=k)rotate((x==son[y][0])^(y==son[z][0])?x:y);
		rotate(x);
	}
	if(!k)rt=x;
}
int biuld(int f,int l,int r){
	if(l>r)return 0;
	int mid=(l+r)>>1;
	int x=++cnt;
	pos[a[mid].val]=x;
	val[x]=a[mid].val;
	fa[x]=f;
	//flag[x]=0;
	son[x][0]=biuld(x,l,mid-1);
	son[x][1]=biuld(x,mid+1,r);
	update(x);
	return x;
}
int suf(){
	down(rt);
	int x=son[rt][1];
	while(down(x),son[x][0])x=son[x][0];
	return x;
}
int cmp1(node x,node y){
	return x.val==y.val?x.xh<y.xh:x.val<y.val;
}
int cmp2(node x,node y){
	return x.xh<y.xh;
}
int main(){
	n=read();
	for(int i=1;i<=n;i++){
		a[i+1].val=read();
		a[i+1].xh=i+1;
		//cout<<a[i+1].xh<<" "<<a[i+1].val<<endl;//
	}
	a[1].val=0;
	a[n+2].val=n+1;
	sort(a+2,a+n+2,cmp1);
	/*for(int i=1;i<=n+2;i++)cout<<a[i].xh<<" "<<a[i].val<<endl;//
	cout<<endl<<endl;// */
	for(int i=1;i<=n;i++)a[i+1].val=i;
	sort(a+2,a+n+2,cmp2);
	/*for(int i=1;i<=n+2;i++)cout<<a[i].xh<<" "<<a[i].val<<endl;//
	cout<<endl<<endl;//*/
	rt=biuld(0,1,n+2);
	//cout<<"rt "<<rt<<endl;//
	/*for(int i=1;i<=n+2;i++)cout<<val[i]<<" ";cout<<endl;//
	for(int i=1;i<=n+2;i++)cout<<fa[i]<<" ";cout<<endl;//
	for(int i=1;i<=n+2;i++)cout<<size[i]<<" ";cout<<endl;//
	for(int i=1;i<=n+2;i++)cout<<pos[i]<<" ";cout<<endl<<endl;//*/
	for(int i=1;i<=n;i++){
		int x=pos[i];
		//cout<<"x "<<x<<endl;//
		splay(x,0);
		//cout<<"rt "<<rt<<endl;//
		//for(int j=1;j<=n+2;j++)cout<<size[j]<<" ";cout<<endl;//<<endl;//
		//cout<<"     case 1"<<endl;//
		//cout<<endl;//
		cout<<size[son[x][0]]<<" ";
		x=suf();
		//cout<<"x2 "<<x<<endl;//<<endl;//
		int y=pos[i-1];
		splay(y,0);
		//cout<<"rt2 "<<rt<<endl;//
		//for(int j=1;j<=n+2;j++)cout<<size[j]<<" ";cout<<endl;//<<endl;//
		//cout<<"     case 2"<<endl;//
		splay(x,y);
		//cout<<"rt3 "<<rt<<endl;//
		//for(int j=1;j<=n+2;j++)cout<<size[j]<<" ";cout<<endl;//<<endl;//
		//cout<<"     case 3"<<endl;//
		flag[son[x][0]]^=1;
		//for(int j=1;j<=n+2;j++)cout<<size[j]<<" ";cout<<endl<<endl;//
	}
	return 0;
}
2021/6/28 11:37
加载中...