蒟蒻63分TLE求条
查看原帖
蒟蒻63分TLE求条
1006970
BarkFlorr楼主2025/1/22 22:02

rt

code:

#include<bits/stdc++.h>
// #pragma GCC optimize(1,2,3,"Ofast","inline")
// #define int long long
#define endl "\n"
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*10+ch-'0';ch=getchar();}
	return x*f;
}
inline void print(int x){
	if(x<0) putchar('-'),x=-x;
	if(x>9) print(x/10);
	putchar(x%10+'0');
}
struct Treap{
	struct node{int ls,rs,x,cnt,size;}p[100005];
	int cnt=0;//现有点数
	inline void pushup(int u){p[u].size=p[p[u].ls].size+p[p[u].rs].size+1;}//自行修改
	inline int random(int x,int y){//生成[x,y]之间的随机数
		srand(time(0));
		int xx=rand()*rand();
		return xx%(y-x+1)+x;
	}
	inline void split(int root,int &a,int &b,int x){//分裂
		if(root==0){
			a=b=0;
			return;
		}
		if(p[root].x<=x) a=root,split(p[root].rs,p[a].rs,b,x);
		else b=root,split(p[root].ls,a,p[b].ls,x);
		pushup(root);
	}
	inline void merge(int &root,int a,int b){//合并
		if(!a||!b){
			root=a+b;
			return ;
		}
		if(p[a].cnt<p[b].cnt) root=a,merge(p[root].rs,p[a].rs,b);
		else root=b,merge(p[root].ls,a,p[b].ls);
		pushup(root);
	}
	inline int makenew(int x){//新建
		int root=++cnt;
		p[root].size=1;
		p[root].x=x;
		p[root].ls=p[root].rs=0;
		p[root].cnt=random(1,1e9);
		return root;
	}
	inline void insert(int &root,int x_){//插入
		int x=0,y=0,n=makenew(x_);
		split(root,x,y,x_);
		merge(x,x,n);
		merge(root,x,y);
	}
	inline void del(int &root,int x_){//删除
		int x=0,y=0,z=0;
		split(root,x,y,x_);
		split(x,x,z,x_-1);
		merge(z,p[z].ls,p[z].rs);
		merge(x,x,z);
		merge(root,x,y);
	}
	inline int find1(int root,int x){//查找排名为x的数
		while(p[p[root].ls].size+1!=x){
			if(p[p[root].ls].size<x) x-=p[p[root].ls].size+1,root=p[root].rs;
			else root=p[root].ls;
		}
		return p[root].x;
	}
	inline int find2(int &root,int x_){//查找x的排名
		//记得+1
		int x=0,y=0;
		split(root,x,y,x_-1);
		int t=p[x].size;
		merge(root,x,y);
		return t;
	}
	inline int find3(int &root,int x_){//返回x的前驱
		int x=0,y=0;
		split(root,x,y,x_-1);
		int t=find1(x,p[x].size);
		merge(root,x,y);
		return t;
	}
	inline int find4(int &root,int x_){//返回x的后继
		int x=0,y=0;
		split(root,x,y,x_);
		int t=find1(y,1);
		merge(root,x,y);
		return t;
	}
};
Treap tree;
int n,root;
void solve(){
	n=read();
	for(int i=1;i<=n;i++){
		int op=read(),x=read();
		if(op==1) tree.insert(root,x);
		if(op==2) tree.del(root,x);
		if(op==3) print(tree.find2(root,x)+1),putchar('\n');
		if(op==4) print(tree.find1(root,x)),putchar('\n');
		if(op==5) print(tree.find3(root,x)),putchar('\n');
		if(op==6) print(tree.find4(root,x)),putchar('\n');
	}
}
signed main(){
	int T=1;
	// T=read();
	while(T--) solve();
	return 0;
}
2025/1/22 22:02
加载中...