求Debug
查看原帖
求Debug
200044
JS_TZ_ZHR楼主2020/7/7 22:35

RT

#include<bits/stdc++.h>
using namespace std;
int n,total,root;
struct Treap {
	int son[2],val,size,cnt,dat;
} t[2000005];
void push_up(int p) {
	t[p].size=t[t[p].son[0]].size+t[t[p].son[1]].size+t[p].cnt;
}
int newnode(int val) {
	t[++total].val=val;
	t[total].dat=rand();
	t[total].cnt=t[total].size=1;
	return total;
}
void build() {
	root=newnode(-(1<<30));
	t[root].son[1]=newnode(1<<30);
}
void spin(int &p,int opt) {
	int temp=t[p].son[opt^1];
	t[p].son[opt^1]=t[temp].son[opt];
	t[temp].son[opt]=p;
	p=temp;
	push_up(t[p].son[opt]);
	push_up(p);
}
void insert(int &p,int val) {
	if(!p) {
		p=newnode(val);
		return;
	}
	if(t[p].val==val)t[p].cnt++;
	else {
		if(t[p].val>val) {
			insert(t[p].son[0],val);
			if(t[p].dat<t[t[p].son[0]].dat)spin(p,1);
		} else {
			insert(t[p].son[1],val);
			if(t[p].dat<t[t[p].son[1]].dat)spin(p,0);
		}
	}
	push_up(p);
}
void det(int &p,int val) {
	if(!p)return;
	if(t[p].val==val) {
		if(t[p].cnt>1)t[p].cnt--,push_up(p);
		else {
			if(t[p].son[0]||t[p].son[1]) {
				if(!t[p].son[1]||t[t[p].son[0]].dat>t[t[p].son[1]].dat)
					spin(p,1),det(t[p].son[1],val);
				else spin(p,0),det(t[p].son[0],val);
				push_up(p);
			} else p=0;
		}
	}
	if(val<t[p].val)det(t[p].son[0],val);
	else det(t[p].son[1],val);
	push_up(p);
}
int pre(int val) {
	int p=root,res;
	while(p) {
		if(t[p].val<val)res=t[p].val,p=t[p].son[1];
		else p=t[p].son[0];
	}
	return res;
}
int nxt(int val) {
	int p=root,res;
	while(p) {
		if(t[p].val>val)res=t[p].val,p=t[p].son[0];
		else p=t[p].son[1];
	}
	return res;
}
int rank(int p,int val) {
	if(!p)return 1<<30;
	if(t[p].val==val)return t[t[p].son[0]].size+1;
	else if(t[p].val<val)rank(t[p].son[0],val);
	else return t[t[p].son[0]].size+t[p].cnt+rank(t[p].son[1],val);
}
int val(int p,int rank) {
	if(!p)return 1<<30;
	if(rank<=t[t[p].son[0]].size)return val(t[p].son[0],rank);
	else if(rank<=t[t[p].son[0]].size+t[p].cnt)return t[p].val;
	else return val(t[p].son[1],rank-t[t[p].son[0]].size-t[p].cnt);
}
int main() {
	scanf("%d",&n);
	int opt,x;
	//build();
	while(n--) {
		scanf("%d%d",&opt,&x);
		if(opt==1)insert(root,x);
		if(opt==2)det(root,x);
		if(opt==3)printf("%d\n",rank(root,x));
		if(opt==4)printf("%d\n",val(root,x));
		if(opt==5)printf("%d\n",pre(x));
		if(opt==6)printf("%d\n",nxt(x));
	}
}
2020/7/7 22:35
加载中...