90pts问
查看原帖
90pts问
847559
Chtholly__Nota楼主2024/10/23 18:51

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,cnt,t1,t2,t3,rot;

mt19937 rnd(114514);

struct fhq{
	int ls,rs,va,si;
	unsigned pri;
}t[100010];


int ne(int x){
	t[++cnt].va=x;
	t[cnt].pri=rnd();
	t[cnt].si=1;
	return cnt;
}

void pushup(int x){
	t[x].si=t[t[x].ls].si+t[t[x].rs].si+1;
}

void split(int i,int k,int &x,int &y){
	if(!i){ x=y=0; return ;}
	if(k<=t[i].va){
		x=i;
		split(t[i].rs,k,t[i].rs,y);
	}
	else{
		y=i;
		split(t[i].ls,k,x,t[i].ls);
	}
	pushup(i);
}

int merge(int x,int y){
	if(!x || !y ) return x|y;
	if(t[x].pri<t[y].pri){
		t[x].rs=merge(t[x].rs,y);
		pushup(x);
		return x;
	}
	else{
		t[y].ls=merge(x,t[y].ls);
		pushup(y);
		return y;
	}
}

void insert(int x){
	split(rot,x,t1,t2);
	rot=merge(merge(t1,ne(x)),t2);
}

int kth(int i,int k){
	while(1){
		if(t[t[i].ls].si+1==k){
			return t[i].va;
		}
		if(t[t[i].ls].si>=k){
			i=t[i].ls;
		}
		else{
			k-=t[t[i].ls].si+1;
			i=t[i].rs;
		}
	}
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	int x,op;
	for(int i=1;i<=n;i++){
		cin>>x;
		insert(x);
	}
	while(m--){
		cin>>op>>x;
		if(op==1){
			cout<<kth(rot,x)<<"\n";
		}
		else{
			insert(x);
		}
	}
}

把t的空间开200005就过了,不知道为什么?有没有大佬讲一下

2024/10/23 18:51
加载中...