无旋treap 72pts求调
查看原帖
无旋treap 72pts求调
897933
lelece楼主2024/1/11 15:33

rt,下了#9测试点自己对拍了一下,发现问题都出现在3、4操作上,所有3操作输出少1,4操作输出偏大,不知道是哪里出了问题

评测记录

#include<bits/stdc++.h>
#define ll long long
#define ld long double
using namespace std;
const int N=1e5+5;
int n;
int K[N],KK[N],Top,cnt;
int root,rootl,rootr;
int ans[N],p,e[N],ee[N];
struct sss {
	int key,val,siz;
	int fat,son[2];
} tre[N];
int cmp(int x,int y) {
	return KK[x]<=KK[y];
}
inline void push_up(int now) {
	tre[now].siz=tre[tre[now].son[0]].siz+tre[tre[now].son[1]].siz+1;
}
void split(int now,int k,int &lt,int &rt) {
	if(!now) {
		lt=rt=0;
		return ;
	}
	if(tre[now].val<=k) {
		lt=now;
		split(tre[now].son[1],k,tre[now].son[1],rt);
	} else {
		rt=now;
		split(tre[now].son[0],k,lt,tre[now].son[0]);
	}
	push_up(now);
}
int merge(int lt,int rt) {
	if(!lt||!rt) return lt+rt;
	if(tre[lt].key<tre[rt].key) {
		tre[lt].son[1]=merge(tre[lt].son[1],rt);
		push_up(lt);
		return lt;
	} else {
		tre[rt].son[0]=merge(lt,tre[rt].son[0]);
		push_up(rt);
		return rt;
	}
} 
void f1(int x) {
	if(!root) {
		root=++cnt;
		tre[cnt].val=x;
		tre[cnt].key=K[++Top];
		tre[cnt].siz=1;
		return ;
	}
	split(root,x-1,rootl,rootr);
	tre[++cnt].val=x;
	tre[cnt].key=K[++Top];
	tre[cnt].siz=1;
	rootl=merge(rootl,cnt);
	root=merge(rootl,rootr);
}
void f2(int x) {
	split(root,x,rootl,rootr);
	int lt,rt;
	split(rootl,x-1,lt,rt);
	rt=tre[rt].son[(tre[rt].son[1]>tre[rt].son[0])];
	rootl=merge(lt,rt);
	root=merge(rootl,rootr);
}
void f3(int x) {
	split(root,x-1,rootl,rootr);
	printf("%d\n",tre[rootl].siz+1);
	ans[++p]=tre[rootl].siz+1;
	e[p]=3;
	root=merge(rootl,rootr);
	return ;
}
void f4(int x) {
	int o=root;
	while(1) {
		if(tre[tre[o].son[0]].siz+1==x)
			break;
		if(x<=tre[tre[o].son[0]].siz+1)
			o=tre[o].son[0];
		else {
			x-=tre[tre[o].son[0]].siz+1;
			o=tre[o].son[1];
		}
	}
	printf("%d\n",tre[o].val);
	ans[++p]=tre[o].val;
	e[p]=4;
}
void f5(int x) {
	split(root,x-1,rootl,rootr);
	int o=rootl;
	while(tre[o].son[1]) o=tre[o].son[1];
	printf("%d\n",tre[o].val);
	ans[++p]=tre[o].val;
	e[p]=5;
	root=merge(rootl,rootr);
}
void f6(int x) {
	split(root,x,rootl,rootr);
	int o=rootr;
	while(tre[o].son[0]) o=tre[o].son[0];
	printf("%d\n",tre[o].val);
	ans[++p]=tre[o].val;
	e[p]=6;
	root=merge(rootl,rootr);
}

int main() {
    srand(time(0));
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {
    	K[i]=i;
    	KK[i]=rand();
	}
	sort(K+1,K+n+1,cmp);
	int opt,x;
	while(n--) {
		scanf("%d%d",&opt,&x);
		if(opt==1) {
			f1(x);
		}
		if(opt==2) {
			f2(x);
		}
		if(opt==3) {
			f3(x);
		}
		if(opt==4) {
			f4(x);
		}
		if(opt==5) {
			f5(x);
		}
		if(opt==6) {
			f6(x);
		}
	}
	return 0;
}
2024/1/11 15:33
加载中...