社区讨论
关于样例强度
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 条回复,欢迎继续交流。
正在加载回复...