社区讨论

关于样例强度

P3369【模板】普通平衡树参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lp27i4y4
此快照首次捕获于
2023/11/17 13:55
2 年前
此快照最后确认于
2023/11/17 17:08
2 年前
查看原帖
CPP
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<random>
using namespace std;
#define Ed for(int i=h[x];~i;i=ne[i])
#define Ls(i,l,r) for(int i=l,i##end=r;i<i##end;++i)
#define Rs(i,l,r) for(int i=l,i##end=r;i>i##end;--i)
#define Le(i,l,r) for(int i=l,i##end=r;i<=i##end;++i)
#define Re(i,l,r) for(int i=l,i##end=r;i>=i##end;--i)
#define L(i,l) for(int i=0,i##end=l;i<i##end;++i)
#define E(i,l) for(int i=1,i##end=l;i<=i##end;++i)
#define W(t) while(t--)
#define Wh while
random_device rnd;
mt19937 rd(rnd());
const int N=100010;
int v[N],l[N],r[N],sz[N],rt,idx;
unsigned pri[N];
void pushup(int p){
	sz[p]=sz[l[p]]+sz[r[p]]+1;
}
void split(int p,int &x,int &y,int k){
	if(!p){
		x=y=0;
		return;
	}
	if(v[p]<=k){
		x=p;
		split(r[p],r[p],y,k);
	}
	else{
		y=p;
		split(l[p],x,l[p],k);
	}
	pushup(p);
}
int node(int k){
	v[++idx]=k;
	pri[idx]=rd();
	sz[idx]=1;
	return idx;
}
int merge(int x,int y){
	if(!x||!y)return x|y;
	if(pri[x]>pri[y]){
		r[x]=merge(r[x],y);
		pushup(x);
		return x;
	}
	else{
		l[y]=merge(x,l[y]);
		pushup(y);
		return y;
	}
}
void ins(int k){
	int x,y;
	split(rt,x,y,k);
	rt=merge(merge(x,node(k)),y);
}
void del(int k){
	int x,y,z;
	split(rt,x,y,k-1);
	split(y,y,z,k);
	y=merge(l[y],r[y]);
	rt=merge(x,merge(y,z));
}
int gkey(int k){
	int p=rt;
	Wh(p){
		if(sz[l[p]]>=k)p=l[p];
		else if(sz[l[p]]+1==k)return v[p];
		else k-=sz[l[p]]+1,p=r[p];
	}
	return -1;
}
void grank(int k){
	int x,y;
	split(rt,x,y,k-1);
	cout<<sz[x]+1<<'\n';
	rt=merge(x,y);
}
void pre(int k){
	int x,y;
	split(rt,x,y,k-1);
	int p=x;
	Wh(r[p])p=r[p];
	cout<<v[p]<<'\n';
	rt=merge(x,y);
}
void ne(int k){
	int x,y;
	split(rt,x,y,k);
	int p=y;
	Wh(l[p])p=l[p];
	cout<<v[p]<<'\n';
	rt=merge(x,y);
}
int main(){
	#ifndef ONLINE_JUDGE
	freopen("1.in","r",stdin);
	#endif
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n;
	cin>>n;
	W(n){
		int op,x;
		cin>>op>>x;
		if(op==1)ins(x);
		else if(op==2)del(x);
		else if(op==3)grank(x);
		else if(op==4)cout<<gkey(x)<<'\n';
		else if(op==5)pre(x);
		else ne(x);
	}
	return 0;
}
第23行漏掉+1可过样例(doge

回复

2 条回复,欢迎继续交流。

正在加载回复...