新颖65pts WA+TLE错法
查看原帖
新颖65pts WA+TLE错法
1296826
lcfollower楼主2024/6/27 21:14

借了同学的号,不喜勿喷

#include<bits/stdc++.h>
//#define int long long
#define little_dog puts("OvO,2021zjhs005 is better than me.")
#define lcfollower break
#define _2021zjhs005 continue
#define inf 0x3f3f3f3f
#define infi 0x3f3f3f3f3f3f3f3fll
#define up(i,x,y) for(register int i=x;i<=y;++i)
#define dn(i,x,y) for(register int i=x;i>=y;--i)
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return x*f;}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10|48);}
inline void writeln(int x){write(x),putchar('\n');}
inline void writesp(int x){write(x),putchar(' ');}
struct lc{
	inline void fre(){freopen(".in","r",stdin);freopen(".out","w",stdout);}
	inline void ext(){exit(0);}
};namespace LC{
	int tot=0,root=0;
	inline int bigrand(int n){int randint=0;up(i,1,n)randint=randint*10+(rand()%10+0);return randint;}
	struct Treap{int val,pri,ls,rs,cnt,siz;Treap(){val=pri=ls=rs=cnt=siz=0;}}a[100001];
	int newnode(int u,int val){a[u].ls=a[u].rs=0,a[u].cnt=a[u].siz=1,a[u].val=val,a[u].pri=bigrand(5);return u;}
	void pushup(int u){a[u].siz=a[a[u].ls].siz+a[a[u].rs].siz+a[u].cnt;}
	void spilt(int u,int val,int &x,int &y){
		if(u==0){x=y=0;return ;}
		int tmp1,tmp2;
		if(a[u].val<=val){
			spilt(a[u].rs,val,tmp1,tmp2);
			a[u].rs=tmp1;
			x=u,y=tmp2;
		}else{
			spilt(a[u].ls,val,tmp1,tmp2);
			a[u].ls=tmp2;
			x=tmp1,y=u;
		}pushup(u);
	}int merge(int u,int v){
		if(u==0)return v;
		if(v==0)return u;
		if(a[u].pri<=a[v].pri){
			a[u].rs=merge(a[u].rs,v);
			pushup(u);return u;
		}else{
			a[v].ls=merge(u,a[v].ls);
			pushup(v);return v;
		}
	}int rk_to_val(int u,int rk){
		if(rk<=a[a[u].ls].siz)return rk_to_val(a[u].ls,rk);
		else if(rk<=a[a[u].ls].siz+a[u].cnt)return a[u].val;
		else return rk_to_val(a[u].rs,rk-a[a[u].ls].siz-a[u].cnt);
	}void insert(int u,int val){
		int tmp1,tmp2,tmp3;
		spilt(u,val-1,tmp1,tmp2);
		spilt(tmp2,val,tmp2,tmp3);
		if(tmp2==0)tmp2=newnode(++tot,val);
		else ++a[tmp2].cnt;
		root=merge(tmp1,merge(tmp2,tmp3));
	}void deleted(int u,int val){
		int tmp1,tmp2,tmp3;
		spilt(u,val-1,tmp1,tmp2);
		spilt(tmp2,val,tmp2,tmp3);
		if(a[tmp2].cnt<=1)root=merge(tmp1,tmp3);
		else --a[tmp2].cnt,root=merge(tmp1,merge(tmp2,tmp3));
	}int val_to_rk(int u,int val){
		int tmp1,tmp2,ans;
		spilt(u,val-1,tmp1,tmp2);
		ans=a[tmp1].siz;
		root=merge(tmp1,tmp2);
		return ans;
	}int the_prev(int u,int val){
		int tmp1,tmp2,ans;
		spilt(u,val-1,tmp1,tmp2);
		ans=rk_to_val(tmp1,a[tmp1].siz);
		root=merge(tmp1,tmp2);
		return ans;
	}int the_next(int u,int val){
		int tmp1,tmp2,ans;
		spilt(u,val,tmp1,tmp2);
		ans=rk_to_val(tmp2,1);
		root=merge(tmp1,tmp2);
		return ans;
	}void bianli(int u){
		if(u==0)return ;
		bianli(a[u].ls);
		writesp(a[u].val);
		bianli(a[u].rs);
	}void bianliln(int u){bianli(u),putchar('\n');}
	inline void main(){
		lc follower;
		//follower.fre();
		srand(time(NULL));
		int n=read();
		up(i,1,n){
			int opt=read(),x=read();
			switch(opt){
				case 1:insert(root,x);break;
				case 2:deleted(root,x);break;
				case 3:writeln(val_to_rk(root,x)+1);break;
				case 4:writeln(rk_to_val(root,x));break;
				case 5:writeln(the_prev(root,x));break;
				case 6:writeln(the_next(root,x));break;
			}
		}follower.ext();
	}
}signed main(){
	LC::main();
}
2024/6/27 21:14
加载中...