bzoj 3224 Tyvj 1728 普通平衡树
来源:互联网 发布:c语言求根号函数 编辑:程序博客网 时间:2024/06/06 01:27
还是SPLAY啦
坚持每日一道SPLAY
明天开启网络流计划
平衡树的基本操作
#include<bits/stdc++.h>using namespace std;int n,op,x;struct splay_node{ int val,siz,cnt; splay_node *fa,*son[2]; splay_node(int _val,splay_node *_fa) { val=_val;siz=cnt=1; fa=_fa;son[0]=son[1]=0; } bool dir() { return this==this->fa->son[1]; } bool cmp(int _val) { return _val>val; }}*rt=0;void maintain(splay_node * o){ o->siz=o->cnt; for(int i=0;i<2;i++) if(o->son[i]) o->siz+=o->son[i]->siz,o->son[i]->fa=o;}void rorate(splay_node * o){ splay_node * p = o->fa; int d=o->dir(); p->son[d]=o->son[d^1]; o->son[d^1]=p; o->fa=p->fa; if(p->fa) p->fa->son[p->dir()]=o; maintain(p),maintain(o);}void splay(splay_node * o,splay_node *t){ while(o->fa!=t) { splay_node * p = o->fa; if(p->fa==t) rorate(o); else if(p->dir()==o->dir()) rorate(p),rorate(o); else rorate(o),rorate(o); } if(!t) rt=o;}void insert(splay_node * &o,splay_node * fa,int val){ if(!o) { o=new splay_node(val,fa); splay(o,0); return ; } if(val>o->val) insert(o->son[1],o,val); else if(val<o->val) insert(o->son[0],o,val); else o->cnt++,o->siz++,splay(o,0);}splay_node * find(splay_node *o,int val){ if(!o) return o; if(val>o->val) return find(o->son[1],val); else if(val<o->val) return find(o->son[0],val); else return o;}int rank(int val){ splay_node * o =find(rt,val); splay(o,0); if(!o->son[0]) return 1; else return o->son[0]->siz+1;}void del(int val){ splay_node * o=find(rt,val); if(!o) return ; o->cnt--; o->siz--; splay(o,0); if(o->cnt) return ; if(!o->son[0]&&o->son[1]) rt=o->son[1],o->son[1]->fa=0; else if(!o->son[1]&&o->son[0]) rt=o->son[0],o->son[0]->fa=0; else if(!o->son[0]&&!o->son[1]) rt=0 ; else { o->son[0]->fa=0; splay_node * p=o->son[0]; while(p->son[1]) p=p->son[1]; splay(p,0); p->son[1]=o->son[1]; maintain(p); }}int ask(splay_node * o,int k){ if(!o->son[0]&&k<=o->cnt) return o->val; if(!o->son[0]) return ask(o->son[1],k-o->cnt); if(o->son[0]->siz>=k) return ask(o->son[0],k); if(o->son[0]->siz+o->cnt>=k) return o->val; return ask(o->son[1],k-o->son[0]->siz-o->cnt);}int xiaoyu(int val){ splay_node * o =rt; int res=0; while(o) { if(o->val>=val) o=o->son[0]; else res=o->val,o=o->son[1]; } return res;}int dayu(int val){ splay_node * o =rt; int res=0; while(o) { if(o->val<=val) o=o->son[1]; else res=o->val,o=o->son[0]; } return res;}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&op,&x); if(op==1) insert(rt,0,x); else if(op==2) del(x); else if(op==3) printf("%d\n",rank(x)); else if(op==4) printf("%d\n",ask(rt,x)); else if(op==5) printf("%d\n",xiaoyu(x)); else printf("%d\n",dayu(x)); }}/*201 9646735 9687054 13 9646735 9652571 9152691 532833 9646733 532833 532831 1626415 9739841 9481192 9152692 532836 9591611 5318211 9675212 5318211 343410*/
心得:
1. RE WA TLE 的如果LOJ上有,一定先在LOJ上去做,有数据哇!!!!
阅读全文
0 0
- BZOJ 3224: Tyvj 1728 普通平衡树
- BZOJ 3224 Tyvj 1728 普通平衡树
- bzoj 3224: Tyvj 1728 普通平衡树
- 【BZOJ 3224】 Tyvj 1728 普通平衡树
- bzoj 3224/Tyvj 1728 普通平衡树
- bzoj 3224,tyvj 1728普通平衡树
- bzoj 3224: Tyvj 1728 普通平衡树
- BZOJ 3224 Tyvj 1728 普通平衡树
- BZOJ 3224 TYVJ 1728 普通平衡树
- BZOJ 3224:Tyvj 1728 普通平衡树
- 【bzoj 3224】【Tyvj 1728】 普通平衡树
- BZOJ 3224: Tyvj 1728 普通平衡树
- [BZOJ]3224: Tyvj 1728 普通平衡树
- BZOJ 3224: Tyvj 1728 普通平衡树
- 【bzoj 3224】Tyvj 1728 普通平衡树
- BZOJ 3224: Tyvj 1728 普通平衡树
- bzoj 3224: Tyvj 1728 普通平衡树
- bzoj 3224: Tyvj 1728 普通平衡树
- FastJson与Jackson生成json时的区别
- Android 设计模式之原型模式
- sql 反模式学习
- TCP粘包
- sql 根据指定字符截取前面几个字符
- bzoj 3224 Tyvj 1728 普通平衡树
- 我的Android的进阶之旅------>如何获取系统中定义了那些权限
- 30跳转
- ognl与valueStack
- JAVA HashSet 去除重复值原理
- Java实现图片压缩
- 后台调js方法
- servlet与struts2的存值方式
- django初学习