1 条题解
-
0
C++ :
#include<cstdio> #include<cstdlib> struct Node{ Node *ch[2]; int v,u,s,r; Node(int x){ch[0]=ch[1]=NULL; v=x; u=rand(); s=r=1;} void update(){s=(ch[0]?ch[0]->s:0)+(ch[1]?ch[1]->s:0)+r;} }*rt; void rotate(Node *&p,int d){ Node* q=p->ch[d]; p->ch[d]=q->ch[d^1]; q->ch[d^1]=p; p->update(); q->update(); p=q; } void insert(Node *&p,int v){ if(!p) p=new Node(v); else if(p->v==v) ++p->r; else{ int d=v>p->v; insert(p->ch[d],v); if(p->ch[d]->u<p->u) rotate(p,d); } p->update(); } void erase(Node *&p,int v){ if(p->v==v){ --p->r; if(p->r>0){p->update(); return;} if(!p->ch[0]) p=p->ch[1];else if(!p->ch[1]) p=p->ch[0]; else{ int d=p->ch[0]->u>p->ch[1]->u; rotate(p,d); erase(p->ch[d^1],v); } }else erase(p->ch[v>p->v],v); if(p) p->update(); } int kth(Node *p,int k){ int ln=p->ch[0]?p->ch[0]->s:0; if(k>ln&&k<=ln+p->r) return p->v; if(k<=ln) return kth(p->ch[0],k); return kth(p->ch[1],k-ln-p->r); } int rank(Node *p,int v){ if(!p) return 0; int ln=p->ch[0]?p->ch[0]->s:0; if(v==p->v) return ln; if(v<p->v) return rank(p->ch[0],v); return ln+p->r+rank(p->ch[1],v); } int pre(Node *p,int v){ if(!p) return 1e9; else if(p->v<v){ int ans=pre(p->ch[1],v); if(ans==1e9) return p->v; return ans; }else return pre(p->ch[0],v); } int suc(Node *p,int v){ if(!p) return 1e9; else if(p->v>v){ int ans=suc(p->ch[0],v); if(ans==1e9) return p->v; return ans; }else return suc(p->ch[1],v); } int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;++i){ int x,y; scanf("%d%d",&x,&y); if(x==0) insert(rt,y);else if(x==1) erase(rt,y); else if(x==3) printf("%d\n",rank(rt,y)); else if(x==2) printf("%d\n",kth(rt,y)); else if(x==4){ int ans=pre(rt,y); if(ans==1e9) printf("-1\n"); else printf("%d\n",ans); }else if(x==5){ int ans=suc(rt,y); if(ans==1e9) printf("-1\n"); else printf("%d\n",ans); } } return 0; }
- 1
信息
- ID
- 1014
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者