蒟蒻求助 ,Treap TLE 9、11
查看原帖
蒟蒻求助 ,Treap TLE 9、11
273371
Mr_Eightkkksd03楼主2020/7/19 10:09
//#include <bits/c++config.h>
#include <iostream>
#include <iomanip>
#include <math.h>
#include <cmath>
#include <algorithm>
#include <climits>
#include <functional>
#include <cstring>
#include <string>
#include <cstdlib>
#include <ctime>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <bitset>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define itn int
#define nit int
#define ll long long //不开long long见祖宗!!!!!
#define ms multiset
#define F(i,a,b) for(register int i=a,i##end=b;i<=i##end;++i)
#define UF(i,a,b) for(register int i=a,i##end=b;i>=i##end;--i)
#define openf(a) freopen(#a".in","r",stdin);freopen(#a".out","w",stdout)
#define re register
#define ri re int
#define il inline
#define endl '\n'//血的教训!!!!!
//#pragma GCC optimize(3)
using namespace std;
using std::bitset;
using namespace __gnu_pbds;
inline int read() {
	int x=0;
	bool fu=0;
	char ch=0;
	while(ch>'9'||ch<'0') {
		ch=getchar();
		if(ch=='-')fu=1;
	}
	while(ch<='9'&&ch>='0') x=(x*10+ch-48),ch=getchar();
	return fu?-x:x;
}
int root,now;
long long rd=233;
inline long long randint() {    
	rd*=2333;
	rd+=23333;	
	rd%=1000000007;
	return rd;
}
struct Treap {
	int v,num,p,f,c[2],size;
} t[1000002];
inline void pushup(int pos) {
	while(pos!=root) {
		t[pos].size++;
		pos=t[pos].f;
	}
	t[pos].size++;
}
inline void popup(int pos) {
	while(pos!=root) {
		t[pos].size--;
		pos=t[pos].f;
	}
	t[pos].size--;
}
inline bool type(int pos) {
	return t[t[pos].f].c[1]==pos;
}
inline void ro(int p) {
	bool tp=type(p);
	ri f=t[p].f,bro=t[t[p].f].c[!tp],gf=t[t[p].f].f;
	int ch[2]= {t[p].c[0],t[p].c[1]};
	if(f==root)root=p;
	t[f].f=p;
	t[p].f=gf;
	t[p].c[!tp]=f;
	t[f].c[tp]=ch[!tp];
	t[ch[!tp]].f=f;
	if(t[gf].c[0]==f)t[gf].c[0]=p;
	else t[gf].c[1]=p;
	t[p].size+=t[bro].size+t[f].num;
	t[f].size-=t[ch[tp]].size+t[p].num;
}
inline void insert(int v) {
	if(!root) {
		root=++now;
		t[now].v=v;
		t[now].num=t[now].size=1;
		t[now].p=randint();
	} else {
		ri pos=root;
		while(1) {
			if(v==t[pos].v) {
				t[pos].num++;
				pushup(pos);
				return;
			}
			if(v<t[pos].v) {
				if(t[pos].c[0]) {
					pos=t[pos].c[0];
					continue;
				} else {
					t[pos].c[0]=++now;
					t[now].v=v;
					t[now].f=pos;
					t[now].num=1;
					t[now].p=randint();
					pushup(now);
					while(t[now].p>t[t[now].f].p&&now!=root)ro(now);
					return;
				}
			} else {
				if(t[pos].c[1]) {
					pos=t[pos].c[1];
					continue;
				} else {
					t[pos].c[1]=++now;
					t[now].v=v;
					t[now].f=pos;
					t[now].num=1;
					t[now].p=randint();
					pushup(now);
					while(t[now].p>t[t[now].f].p&&now!=root)ro(now);
					return;
				}
			}
		}
	}
}
inline int count(int v) {
	ri pos=root;
	while(1) {
		if(v==t[pos].v) {
			return t[pos].num;
		}
		if(v<t[pos].v) {
			if(t[pos].c[0]) {
				pos=t[pos].c[0];
				continue;
			} else {
				return 0;
			}
		} else {
			if(t[pos].c[1]) {
				pos=t[pos].c[1];
				continue;
			} else {
				return 0;
			}
		}
	}
}
inline int last(int pos){
	if(t[pos].c[0]){
		pos=t[pos].c[0];
		while(t[pos].c[1])pos=t[pos].c[1];
		return pos;
	}else{
		while(type(pos)==0)pos=t[pos].f;
		return t[pos].f;
	}
}
inline int next(int pos){
	if(t[pos].c[1]){
		pos=t[pos].c[1];
		while(t[pos].c[0])pos=t[pos].c[0];
		return pos;
	}else{
		while(type(pos))pos=t[pos].f;
		return t[pos].f;
	}
}
inline int findpos(int v){
	ri pos=root;
	while(1) {
		if(v==t[pos].v) {
			return pos;
		}
		if(v<t[pos].v) {
			if(t[pos].c[0]) {
				pos=t[pos].c[0];
				continue;
			} else {
				return last(pos);
			}
		} else {
			if(t[pos].c[1]) {
				pos=t[pos].c[1];
				continue;
			} else {
				return pos;
			}
		}
	}
}
inline int fbo(int k,int pos){
	if(k>t[t[pos].c[0]].size&&k<=t[t[pos].c[0]].size+t[pos].num)return pos;
	if(k<=t[t[pos].c[0]].size)return fbo(k,t[pos].c[0]);
	else return fbo(k-t[t[pos].c[0]].size-t[pos].num,t[pos].c[1]);
}
inline int find_by_order(int k){
    return fbo(k,root);
}
inline int order_of_key(int v){
	ri pos=findpos(v),lst=t[pos].c[1],rt=0;
	t[root].f=0;
	rt=1-t[pos].num;
	for(;pos;pos=t[pos].f){
		if(t[pos].c[1]==lst){
			rt+=t[pos].num+t[t[pos].c[0]].size;
		}lst=pos;
	}return rt;
}
inline void erase_pos(int pos){
	if(t[pos].num>1){
		t[pos].num--;
		popup(pos);
		return;
	}
	ri lc=t[pos].c[0],rc=t[pos].c[1];
	if(lc==0&&rc==0){
		popup(pos);
		t[t[pos].f].c[type(pos)]=0;
		t[pos].f=0;
		return;
	}if(lc==0){
		ro(rc);
		erase_pos(pos);
		return;
	}if(rc==0){
		ro(lc);
		erase_pos(pos);
		return;
	}else{
		if(t[lc].p>t[rc].p){
			ro(lc);
			erase_pos(pos);
			return;
		}else{
			ro(rc);
			erase_pos(pos);
			return;
		}
	}
}
inline void erase(int v){
	ri pos=findpos(v);
	if(t[pos].v!=v)return;
	erase_pos(pos);
}
int n,opt,x,k;
int main() {
    cin>>n;
    F(i,1,n){
    	opt=read();
    	x=read();
    	if(opt==1){
    		insert(x);
		}if(opt==2){
			erase(x);
		}if(opt==3){
			cout<<order_of_key(x)<<endl;k++;
		}if(opt==4){
			cout<<t[find_by_order(x)].v<<endl;k++;
		}if(opt==5){
			int pos=findpos(x);
			if(t[pos].v==x){
				cout<<t[last(pos)].v<<endl;
			}else cout<<t[pos].v<<endl;k++;
		}if(opt==6){
			cout<<t[next(findpos(x))].v<<endl;k++;
		}
	}
	return 0;
}
2020/7/19 10:09
加载中...