比赛 |
数据结构模板题 |
评测结果 |
AAAAAAAAAA |
题目名称 |
普通平衡树 |
最终得分 |
100 |
用户昵称 |
郑霁桓 |
运行时间 |
0.812 s |
代码语言 |
C++ |
内存使用 |
4.48 MiB |
提交时间 |
2025-04-15 19:05:16 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long T,op,xx,tp=1,tt,as,I=1e18,rt=1;
struct N{
long long l,r,v,p,sz,ct;
}a[100005];
void pd(long long ps){
a[ps].sz=a[a[ps].l].sz+a[a[ps].r].sz+a[ps].ct;return;
}
void zig(long long &ps){
long long q=a[ps].l;
a[ps].l=a[q].r,a[q].r=ps,ps=q;
pd(a[ps].r),pd(ps);
}
void zag(long long &ps){
long long q=a[ps].r;
a[ps].r=a[q].l,a[q].l=ps,ps=q;
pd(a[ps].l),pd(ps);
}
void ins(long long &ps,long long x){
if(!ps){a[++tt]={0,0,x,rand(),1,1},ps=tt;return;}
if(a[ps].v==x){a[ps].ct++,pd(ps);return;}
if(x<a[ps].v){
ins(a[ps].l,x);
if(a[a[ps].l].p>a[ps].p) zig(ps);
}
if(x>a[ps].v){
ins(a[ps].r,x);
if(a[a[ps].r].p>a[ps].p) zag(ps);
}
pd(ps);
return;
}
void era(long long &ps,long long x){
if(!ps) return;
if(a[ps].v==x){
if(a[ps].ct>1){a[ps].ct--,pd(ps);return;}
if(!a[ps].l&&!a[ps].r){ps=0;return;}
if(!a[ps].l||(a[a[ps].l].p<a[a[ps].r].p)){
zag(ps),era(a[ps].l,x),pd(ps);
return;
}else{
zig(ps),era(a[ps].r,x),pd(ps);
return;
}
}
if(a[ps].v<x){era(a[ps].r,x),pd(ps);return;}
if(a[ps].v>x){era(a[ps].l,x),pd(ps);return;}
}
long long vk(long long ps,long long x){
if(!ps) return 0;
if(a[ps].v==x) return a[a[ps].l].sz;
if(a[ps].v>x) return vk(a[ps].l,x);
if(a[ps].v<x) return vk(a[ps].r,x)+a[a[ps].l].sz+a[ps].ct;
}
long long kv(long long ps,long long x){
if(!ps) return I;
if(a[a[ps].l].sz>=x) return kv(a[ps].l,x);
if(a[a[ps].l].sz+a[ps].ct>=x) return a[ps].v;
return kv(a[ps].r,x-a[a[ps].l].sz-a[ps].ct);
}
long long pr(long long x){
as=-1e15,tp=rt;
while(tp){
if(a[tp].v==x){
if(a[tp].l>0){
tp=a[tp].l;
while(a[tp].r>0) tp=a[tp].r;
as=a[tp].v;
return as;
}else return as;
}
if(a[tp].v>x) tp=a[tp].l;
else as=max(as,a[tp].v),tp=a[tp].r;
}
return as;
}
long long nt(long long x){
as=1e15,tp=rt;
while(tp){
if(a[tp].v==x){
if(a[tp].r>0){
tp=a[tp].r;
while(a[tp].l>0)tp=a[tp].l;
as=a[tp].v;
return as;
}else return as;
}
if(a[tp].v>x) as=min(as,a[tp].v),tp=a[tp].l;
else tp=a[tp].r;
}
return as;
}
int main(){
freopen("phs.in","r",stdin);
freopen("phs.out","w",stdout);
ios::sync_with_stdio(false);
cin>>T;
a[++tt]={0,0,-I,rand(),1,1};
ins(rt,I);
while(T--){
cin>>op>>xx;
if(op==1) ins(rt,xx);
if(op==2) era(rt,xx);
if(op==3) cout<<vk(rt,xx)<<"\n";
if(op==4) cout<<kv(rt,xx+1)<<"\n";
if(op==5) cout<<pr(xx)<<"\n";
if(op==6) cout<<nt(xx)<<"\n";
}
return 0;
}