qaq
查看原帖
qaq
352464
JJA_楼主2021/4/11 19:21

Treap24分,估计是亿些奇奇怪怪的地方错了waw

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<queue>
//#include<map>
#include<vector>
#include<math.h>
using namespace std;
//#define int long long
#define forr(i,a,b) for(int i=a;i<=b;i++)
#define repp(i,a,b) for(int i=a;i>=b;i--)
#define INF 1e9
#define ll long long
#define MAXN 200005
const int _x[]={0,1,0,-1,0},_y[]={0,0,1,0,-1};
#define mem(a,n) memset(a,n,sizeof(a));
#define chkmax(a,b) a=a>b?a:b;
#define chkmin(a,b) a=a<b?a:b;
#include<set>
#include<stack>
#define INF 1e9
int sum,tot,root;
struct Treap_tree{
	int l,r;
	int dat,size;
	int cnt,val;
}tree[MAXN*4];
#define lc tree[i].l
#define rc tree[i].r
void update(int i){
	tree[i].size=tree[lc].size+tree[rc].size+tree[i].cnt;
}
int getrk(int i,int val){
	if(i==0){
		return 0;
	}
	if(val==tree[i].val){
		return tree[lc].size+1;
	}
	if(val<tree[i].val){
		return getrk(lc,val);
	}
	return getrk(rc,val)+tree[lc].size+tree[i].cnt;
}
int getval(int i,int val){
	if(i==0){
		return INF;
	}
	if(tree[lc].size>=val){
		return getval(lc,val);
	}
	if(tree[lc].size+tree[i].cnt>=val){
		return tree[i].val;
	}
	return getval(rc,val-tree[lc].size-tree[i].cnt);
}
void zig(int &i){
	int l=lc;
	lc=tree[l].r,tree[l].r=i;
	i=l;
	update(rc);
	update(i);
}
void zag(int &i){
	int r=rc;
	rc=tree[r].l,tree[r].l=i;
	i=r;
	update(rc);
	update(i);
}
void Insert(int &i,int val){
	if(i==0){
		i=++tot;
		tree[i].dat=rand();
		tree[i].size=tree[i].cnt=1;
		tree[i].val=val;
		return;
	}
	if(val==tree[i].val){
		tree[i].cnt++;
		update(i);
		return;
	}
	if(val<tree[i].val){
		Insert(lc,val);
		if(tree[i].dat<tree[lc].dat){
			zig(i);
		}
	}
	else{
		Insert(rc,val);
		if(tree[i].dat<tree[rc].dat){
			zag(i);
		}
	}
}
int gp(int i,int val){
	if(!i){
		return -INF;
	}
	if(val<=tree[i].val){
		gp(lc,val);
	}
	else{
		return max(gp(rc,val),tree[i].val);
	}
}
int gn(int i,int val){
	if(!i){
		return INF;
	}
	if(val>=tree[i].val){
		gn(rc,val);
	}
	else{
		return min(tree[i].val,gn(lc,val));
	}
}
void pop(int &i,int val){
	if(i==0){
		return;
	}
	if(val==tree[i].val){
		if(tree[i].cnt>1){
			tree[i].cnt--;
			update(i);
			return;
		}
		if(lc||rc){
			if(rc==0||tree[lc].dat>tree[rc].dat){
				zig(i);
				pop(rc,val);
			}
			else{
				zag(i);
				pop(lc,val);
			}
			update(i);
		}
		else{
			i=0;
		}
		return;
	}
	if(val<tree[i].val){
		pop(lc,val);
	}
	else{
		pop(rc,val);
	}
	update(i);
}
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int opt,x;
		scanf("%d%d",&opt,&x);
		switch(opt){
			case 1:{
				Insert(root,x);
				break;
			}
			case 2:{
				pop(root,x);
				break;
			}
			case 3:{
				printf("%d\n",getrk(root,x));
				break;
			}
			case 4:{
				printf("%d\n",getval(root,x));
				break;
			}
			case 5:{
				printf("%d\n",gp(root,x));
				break;
			}
			case 6:{
				printf("%d\n",gn(root,x));
				break;
			}
		}
	}
}
2021/4/11 19:21
加载中...