[BZOJ3224]Tyvj 1728 普通平衡树
2015-08-08 21:14
344 查看
原题地址
这题可以当我的FHQ_Theap模板了…
BZOJ不能用time(0)!!!
BZOJ不能用time(0)!!!
BZOJ不能用time(0)!!!
用了就RE!!!要直接用rand()!!!
妈呀调了大半个晚上简直呵呵呵…这题可以当我的FHQ_Theap模板了…
#include <cstdio> #include <cstdlib> const int N=100010; int n,tot; struct nod{ int val,size,fix; nod *lc,*rc; }pool ,*NIL; struct Treap{ nod *root; Treap(){ root=NIL=&pool[tot++]; } void update(nod *p){ p->size=p->lc->size+p->rc->size+1; } nod* merge(nod *p1,nod *p2){ if(p1==NIL) return p2; if(p2==NIL) return p1; if(p1->fix<p2->fix){ p2->lc=merge(p1,p2->lc); update(p2); return p2; } p1->rc=merge(p1->rc,p2); update(p1); return p1; } void split(nod *p,nod *&p1,nod *&p2,int k){ if(p==NIL){ p1=p2=NIL; return ; } if(p->lc->size+1>k){ split(p->lc,p1,p2,k); p->lc=NIL; update(p); p2=merge(p2,p); } else{ split(p->rc,p1,p2,k-p->lc->size-1); p->rc=NIL; update(p); p1=merge(p,p1); } } int getrank(nod *p,int x){ if(p==NIL) return 1; return p->val>=x?getrank(p->lc,x):getrank(p->rc,x)+p->lc->size+1; } nod* newnod(int x){ nod *p=&pool[tot++]; p->val=x;p->size=1;p->fix=rand()*rand()%N;p->lc=p->rc=NIL; return p; } void insert(int x){ nod *p1,*p2; split(root,p1,p2,getrank(root,x)-1); root=merge(merge(p1,newnod(x)),p2); } void erase(int x){ nod *p1,*p2,*p3,*p4; split(root,p1,p2,getrank(root,x)-1); split(p2,p3,p4,1); root=merge(p1,p4); } void getkth(int x){ nod *p1,*p2,*p3,*p4; split(root,p1,p2,x-1); split(p2,p3,p4,1); printf("%d\n",p3->val); root=merge(merge(p1,p3),p4); } nod* getpre(nod *p,int x){ if(p==NIL) return p; if(p->val>=x) return getpre(p->lc,x); nod *q=getpre(p->rc,x); return q!=NIL?q:p; } nod* getsuc(nod *p,int x){ if(p==NIL) return p; if(p->val<=x) return getsuc(p->rc,x); nod *q=getsuc(p->lc,x); return q!=NIL?q:p; } }T; int main(){ scanf("%d",&n); while(n--){ int opt,x; scanf("%d%d",&opt,&x); if(opt==1) T.insert(x); else if(opt==2) T.erase(x); else if(opt==3) printf("%d\n",T.getrank(T.root,x)); else if(opt==4) T.getkth(x); else if(opt==5) printf("%d\n",T.getpre(T.root,x)->val); else printf("%d\n",T.getsuc(T.root,x)->val); } return < 4000 span class="hljs-number">0; }
相关文章推荐
- linux apt-get 之LAMP架设
- FragmentTabHost+viewPager实现底部导航栏
- Sum Root to Leaf Numbers
- 两种比较“强壮”的单例代码。
- [M]带属性块参照的转换
- 博客园文章编辑器【客户端应用程序】V2.0.0发布,命名为51cnblogs
- 扫描线 - UVALive - 6864 Strange Antennas
- Linux中命令行和图形界面之间切换
- [转]数据中心网络虚拟化 隧道技术
- 【数论+dp】codeforces559C Gerald and Giant Chess
- 兼容的可视区高度和宽度
- iOS 调试用Log()与随机颜色设置
- 为什么和其他语言相比C语言是快速的语言
- Wayland与Weston简介
- windows内存管理的几种方式的优缺点
- STM32学习笔记 ——流水灯
- 数组
- nginx 开展对RT5350
- css基础与选择器——精通css学习笔记(一)
- 【LeetCode】165 - Compare Version Numbers