bzoj3196Tyvj1730二逼平衡树

题意:

维护一个数列,操作:查询k在区间内的排名、查询区间内排名为k的值3、修改某一位上的数值、查询k在区间内的前驱(前驱定义为小于x,且最大的数)、查询k在区间内的后继(后继定义为大于x,且最小的数)

题解:

线段树套treap,我写了一个星期QAQ第一、三个操作直接搞;第二个操作就二分那个值,然后查它在区间内的排名;第四、五个操作就当查询值≤(≥)当前节点就往左(右)走,用一个全局变量记往左(右)走时遍历过的最大(小)值。反思:本弱各种写挂,以前从来把treap的rotate操作写的和splay的rotate操作一样,结果这题如果还这样写,将会异常麻烦,因此不得不用引用型写法,去掉了一个fa数组,异常不习惯。同时第二个操作也很蛋疼,推了很久(实际上是抄了很久),treap也很久没写了,甚至删除节点还出现if(cnt[x]>1){cnt[x]--,sz[x]--; return;}写成if(cnt[x]>0){cnt[x]--,sz[x]--; return;}的错误,调了一整个晚修QAQ。最后交的时候10s,差点TLE。求了一下序列中的最大最小值,在第二个操作做二分时用,省了0.2s;又将线段树的l、r、lc、rc数组去掉,省了0.6s,最后结果是9.2s,还是卡时啊……

yyl大爷:你要多写些题,提高代码能力! orzzzzzzz……

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <cstdlib>
  5. #include <stack>
  6. #define inc(i,j,k) for(int i=j;i<=k;i++)
  7. #define maxn 2500000
  8. #define maxm 200000
  9. #define INF 0x3fffffff
  10. using namespace std;
  11.  
  12. int v[maxn],rnd[maxn],root[maxm],ch[maxn][],cnt[maxn],sz[maxn],nds,mx,mn,n;
  13. stack <int> pool;
  14. int newnode(){
  15. if(pool.empty())return ++nds;else{int x=pool.top(); pool.pop(); return x;}
  16. }
  17. void delnode(int x){pool.push(x);}
  18. void update(int x){if(! x)return; sz[x]=cnt[x]+sz[ch[x][]]+sz[ch[x][]];}
  19. void rotate(int &x,bool lr){
  20. if(!x)return; int a=ch[x][lr]; ch[x][lr]=ch[a][!lr]; ch[a][!lr]=x; update(x); x=a; update(a);
  21. }
  22. void insert(int &x,int num){
  23. if(!x){int y=newnode(); v[y]=num; rnd[y]=rand(); ch[y][]=ch[y][]=; cnt[y]=sz[y]=; x=y; return;}
  24. if(v[x]==num){cnt[x]++; sz[x]++; return;}
  25. if(num<v[x])insert(ch[x][],num);else insert(ch[x][],num); update(x);
  26. if(ch[x][]&&rnd[ch[x][]]<rnd[x])rotate(x,);
  27. if(ch[x][]&&rnd[ch[x][]]<rnd[x])rotate(x,);
  28. }
  29. void del(int &x,int num){
  30. if(!x)return;
  31. if(v[x]==num){
  32. if(cnt[x]>){cnt[x]--,sz[x]--; return;}
  33. if(ch[x][]*ch[x][]==){delnode(x); x=ch[x][]+ch[x][]; return;} int y=x;
  34. if(rnd[ch[x][]]<rnd[ch[x][]])rotate(x,),del(ch[x][],num);else rotate(x,),del(ch[x][],num);
  35. update(x); return;
  36. }
  37. if(num<v[x])del(ch[x][],num);else del(ch[x][],num); update(x);
  38. }
  39. int rank(int x,int num){
  40. if(!x)return ; if(v[x]==num)return sz[ch[x][]];
  41. if(num<v[x])return rank(ch[x][],num);else return rank(ch[x][],num)+sz[ch[x][]]+cnt[x];
  42. }
  43. int ans;
  44. void before(int x,int num){
  45. if(!x)return; if(num<=v[x])before(ch[x][],num); else ans=max(ans,v[x]),before(ch[x][],num);
  46. }
  47. void after(int x,int num){
  48. if(!x)return; if(num>=v[x])after(ch[x][],num); else ans=min(ans,v[x]),after(ch[x][],num);
  49. }
  50. void add(int x,int l,int r,int pos,int num){
  51. insert(root[x],num); if(l==r)return; int M=(l+r)>>;
  52. if(l<=pos&&pos<=M)add(x<<,l,M,pos,num);
  53. if(M<pos&&pos<=r)add(x<<|,M+,r,pos,num);
  54. }
  55. void change(int x,int l,int r,int pos,int num,int val){
  56. del(root[x],num); insert(root[x],val); if(l==r)return; int M=(l+r)>>;
  57. if(l<=pos&&pos<=M)change(x<<,l,M,pos,num,val); if(M<pos&&pos<=r)change(x<<|,M+,r,pos,num,val);
  58. }
  59. int getrank(int k,int x,int l,int r,int ql,int qr){
  60. if(ql<=l&&r<=qr)return rank(root[x],k); int M=(l+r)>>,q=;
  61. if(ql<=M)q+=getrank(k,x<<,l,M,ql,qr); if(M<qr)q+=getrank(k,x<<|,M+,r,ql,qr); return q;
  62. }
  63. int getindex(int k,int ql,int qr){
  64. int L=mn,R=mx;
  65. while(L<=R){
  66. int M=(L+R)>>; int x=getrank(M,,,n,ql,qr);
  67. if(x+<=k)L=M+,ans=M;else R=M-;
  68. }
  69. return ans;
  70. }
  71. void getbefore(int k,int x,int l,int r,int ql,int qr){
  72. if(ql<=l&&r<=qr){before(root[x],k); return;} int M=(l+r)>>;
  73. if(ql<=M)getbefore(k,x<<,l,M,ql,qr); if(M<qr)getbefore(k,x<<|,M+,r,ql,qr);
  74. }
  75. void getafter(int k,int x,int l,int r,int ql,int qr){
  76. if(ql<=l&&r<=qr){after(root[x],k); return;} int M=(l+r)>>;
  77. if(ql<=M)getafter(k,x<<,l,M,ql,qr); if(M<qr)getafter(k,x<<|,M+,r,ql,qr);
  78. }
  79. int val[maxm],m;
  80. int main(){
  81. scanf("%d%d",&n,&m); mx=-; mn=INF;
  82. inc(i,,n)scanf("%d",&val[i]),mx=max(mx,val[i]),mn=min(mn,val[i]),add(,,n,i,val[i]);
  83. inc(i,,m){
  84. int opt,x,y,z; scanf("%d",&opt);
  85. if(opt==)scanf("%d%d%d",&x,&y,&z),printf("%d\n",getrank(z,,,n,x,y)+);
  86. if(opt==)scanf("%d%d%d",&x,&y,&z),printf("%d\n",getindex(z,x,y));
  87. if(opt==)scanf("%d%d",&x,&y),change(,,n,x,val[x],y),val[x]=y,mx=max(mx,y),mn=min(mn,y);
  88. if(opt==)scanf("%d%d%d",&x,&y,&z),ans=-,getbefore(z,,,n,x,y),printf("%d\n",ans);
  89. if(opt==)scanf("%d%d%d",&x,&y,&z),ans=INF,getafter(z,,,n,x,y),printf("%d\n",ans);
  90. }
  91. return ;
  92. }

20160508

bzoj3196Tyvj1730二逼平衡树的更多相关文章

  1. bzoj 3196: Tyvj 1730 二逼平衡树

    #include<cstdio> #include<ctime> #include<cstdlib> #include<iostream> #defin ...

  2. 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2271  Solved: 935[Submit][Stat ...

  3. 【BZOJ 3196】二逼平衡树 线段树套splay 模板题

    我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排 ...

  4. bzoj 3196 Tyvj 1730 二逼平衡树(线段树套名次树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1807  Solved: 772[Submit][Stat ...

  5. BZOJ_3196_二逼平衡树_(树套树,线段树+Treap)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3196 可以处理区间问题的平衡树. 3196: Tyvj 1730 二逼平衡树 Time Lim ...

  6. BZOJ 3196: Tyvj 1730 二逼平衡树( 树套树 )

    这道题做法应该很多吧.... 我用了线段树套treap.... -------------------------------------------------------------------- ...

  7. [Tyvj 1730] 二逼平衡树

    先来一发题面QwQ [TYVJ1730]二逼平衡树 Time Limit:2 s   Memory Limit:512 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个 ...

  8. 【BZOJ3196】二逼平衡树(树状数组,线段树)

    [BZOJ3196]二逼平衡树(树状数组,线段树) 题面 BZOJ题面 题解 如果不存在区间修改操作: 搞一个权值线段树 区间第K大--->直接在线段树上二分 某个数第几大--->查询一下 ...

  9. BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树

    BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...

随机推荐

  1. (九)maven-surefire-plugin常用配置

    原文链接:https://www.cnblogs.com/pixy/p/4718176.html 对maven-surefire-plugin有想了解的,看这篇:https://www.cnblogs ...

  2. ado.net Web前端:关于JavaScript知识点的简单梳理

    学习js:1.htmml2.cssjs+html+css == html5 js的组成:1).ecamscript ES是js的标准,js 是es 的实现2)文档对象模型(Document Objec ...

  3. Android学习笔记使用AlertDialog实现对话框

    使用AlertDialog可以实现如下对话框 案例 布局问文件就加了几个Button,我直接上Java代码了 实现显示带取消,确定按钮的对话框按钮 Button showDialogOne = fin ...

  4. 【SEED Labs】DNS Rebinding Attack Lab

    Lab Overview 实验环境下载:https://seedsecuritylabs.org/Labs_16.04/Networking/DNS_Rebinding/ 在这个实验中模拟的物联网设备 ...

  5. Python的多继承问题-MRO和C3算法

    大部分内容转载自C3 线性化算法与 MRO 理解Python中的多继承 Python 中的方法解析顺序(Method Resolution Order, MRO)定义了多继承存在时 Python 解释 ...

  6. 说说TCP的三次握手和四次挥手

    一.传输控制协议TCP简介 1.1 简介 TCP(Transmission Control Protocol) 传输控制协议,是一种 面向连接的.可靠的.基于字节流的传输层 通信协议. TCP是一种面 ...

  7. v-if和v-show的使用和特点

    v-if的特点是每次都会重新删除或创建操作 v-show的特点是每次不会进行DOM的删除和创建操作,只是切换了元素的display:none样式 <div id="app"& ...

  8. 必知必会的8个Python列表技巧

    原作者:Nik Piepenbreier 翻译&内容补充:费弗里 原文地址:https://towardsdatascience.com/advanced-python-list-techni ...

  9. linux 上设置mysql开机自启

    此方式是通过安装包安装的,如果是yum安装的rpm包,可参考yum安装MySQL8.0 三个月之前安装的mysql,记得是设置了开机自启,但是今天再次进入的时候发现,无法登录,报错如下 原因是mysq ...

  10. 【Spring注解驱动开发】关于BeanPostProcessor后置处理器,你了解多少?

    写在前面 有些小伙伴问我,学习Spring是不是不用学习到这么细节的程度啊?感觉这些细节的部分在实际工作中使用不到啊,我到底需不需要学习到这么细节的程度呢?我的答案是:有必要学习到这么细节的程度,而且 ...