萌新求助treap 44pts
查看原帖
萌新求助treap 44pts
469066
zzxLLL楼主2021/11/6 17:28

WA #3 #5 #6 #7 #8 #9 #10

#include<bits/stdc++.h>
using namespace std;
const int M=5e4+10;
class TREAP{
	private:
		struct node{
			int lc,rc,pri,val,size,cnt;
		}tr[M];
		int rdm(){
			static unsigned long long zzx=2020150;
			return (zzx*=23333)%2147483648;
		}
		
		int root,cntp;
		int newnode(int val){
			tr[++cntp].val=val;
			tr[cntp].lc=tr[cntp].rc=0;
			tr[cntp].size=tr[cntp].cnt=1;
			tr[cntp].pri=rdm();
			return cntp;
		}
		
		void update(int k){
			tr[k].size=tr[tr[k].lc].size+tr[tr[k].rc].size+tr[k].cnt;
		}
		
		void zig(int &p){
			int q=tr[p].lc;
			tr[p].lc=tr[q].rc;
			tr[q].rc=p;
			tr[q].size=tr[p].size;
			update(p);
			p=q;
		}
		
		void zag(int &p){
			int q=tr[p].rc;
			tr[p].rc=tr[q].lc;
			tr[q].lc=p;
			tr[q].size=tr[p].size;
			update(p);
			p=q;
		}
		
		void ins(int &p,int val){
			if(!p){
				p=newnode(val);
				return;
			}
			tr[p].size++;
			if(tr[p].val==val){
				tr[p].cnt++;
				return;
			}
			if(val<tr[p].val){
				ins(tr[p].lc,val);
				if(tr[tr[p].lc].pri>tr[p].pri) zig(p);
			}else{
				ins(tr[p].rc,val);
				if(tr[tr[p].rc].pri>tr[p].pri) zag(p);
			}
		}
		
		void rem(int &p,int val){
			if(!p) return;
			tr[p].size--;
			if(tr[p].val==val){
				if(tr[p].cnt>1){
					tr[p].cnt--;
					return;
				}
				if(!tr[p].lc||!tr[p].rc) p=tr[p].lc+tr[p].rc;
				else if(tr[tr[p].lc].pri>tr[tr[p].rc].pri){
					zig(p);
					rem(tr[p].rc,val);
				}else{
					zag(p);
					rem(tr[p].rc,val);
				}
				return;
			}
			if(val<tr[p].val) rem(tr[p].lc,val);
			else rem(tr[p].rc,val);
		}
		
		int rank(int p,int val){
			if(!p) return 0;
			if(val==tr[p].val) return tr[tr[p].lc].size+1;
			else if(val<tr[p].val) return rank(tr[p].lc,val);
			else return rank(tr[p].rc,val)+tr[tr[p].lc].size+tr[p].cnt;
		}
		
		int val(int p,int k){
			if(!p) return 0;
			if(tr[tr[p].lc].size>=k) return val(tr[p].lc,k);
			else if(tr[tr[p].lc].size+tr[p].cnt>=k) return tr[p].val;
			else return val(tr[p].rc,k-tr[tr[p].lc].size-tr[p].cnt);
		}
		
		int pre(int val){
			int cur=root,res=2147483647;
			while(cur)
				if(tr[cur].val<val){
					res=tr[cur].val;
					cur=tr[cur].rc;
				}else cur=tr[cur].lc;
			return res;
		}
		
		int suf(int val){
			int cur=root,res=-2147483647;
			while(cur)
				if(tr[cur].val>val){
					res=tr[cur].val;
					cur=tr[cur].lc;
				}else cur=tr[cur].rc;
			return res;
		}
		
	public:
		void insert(int val){
			ins(root,val);
		}
		
		void remove(int val){
			rem(root,val);
		}
		
		int getrank(int val){
			return rank(root,val);
		}
		
		int getval(int k){
			return val(root,k);
		}
		
		int getpre(int val){
			return pre(val);
		}
		
		int getsuf(int val){
			return suf(val);
		}
};

TREAP t;
int n;

int main(){
	scanf("%d",&n); 
	for(int i=1,opt,x;i<=n;i++){
		scanf("%d%d",&opt,&x);
		switch(opt){
			case 1:
				t.insert(x);break;
			case 2:
				t.remove(x);break;
			case 3:
				printf("%d\n",t.getrank(x));break;
			case 4:
				printf("%d\n",t.getval(x));break;
			case 5:
				printf("%d\n",t.getpre(x));break;
			case 6:
				printf("%d\n",t.getsuf(x));break;
			default:break;
		}
	}
	return 0;
}
2021/11/6 17:28
加载中...