比较裸的树套树,对于区间K值bz上有一道裸题,详见题解http://www.cnblogs.com/BLADEVIL/p/3455336.html(其实题解也不是很详细)

//By BLADEVIL
typerec                            =recordleft, right, root        :longint;end;varn, m                        :longint;a                            :array[0..100100] of longint;t                            :array[0..300300] of rec;b_left, b_right, b_key        :array[0..1000010] of longint;b_size                        :array[0..1000010] of longint;tot                            :longint;function min(a,b:longint):longint;
beginif a>b then min:=b else min:=a;
end;function max(a,b:longint):longint;
beginif a>b then max:=a else max:=b;
end;procedure left_rotate(var t:longint);
vark                            :longint;
begink:=b_right[t];b_right[t]:=b_left[k];b_left[k]:=t;b_size[k]:=b_size[t];b_size[t]:=b_size[b_left[t]]+b_size[b_right[t]]+1;t:=k;
end;procedure right_rotate(var t:longint);
vark                            :longint;
begink:=b_left[t];b_left[t]:=b_right[k];b_right[k]:=t;b_size[k]:=b_size[t];b_size[t]:=b_size[b_left[t]]+b_size[b_right[t]]+1;t:=k;
end;procedure maintain(var t:longint;flag:boolean);
beginif not flag then beginif b_size[b_left[b_left[t]]]>b_size[b_right[t]] then right_rotate(t) else if b_size[b_right[b_left[t]]]>b_size[b_right[t]] then beginleft_rotate(b_left[t]);right_rotate(t);end else exit;end else beginif b_size[b_right[b_right[t]]]>b_size[b_left[t]] then left_rotate(t) else if b_size[b_left[b_right[t]]]>b_size[b_left[t]] then beginright_rotate(b_right[t]);left_rotate(t);end else exit;end;maintain(b_left[t],false);maintain(b_right[t],true);maintain(t,true);maintain(t,false);
end;procedure insert(var t:longint;v:longint);
beginif t=0 then begininc(tot);t:=tot;b_left[t]:=0;b_right[t]:=0;b_size[t]:=1;b_key[t]:=v;end else begininc(b_size[t]);if v>=b_key[t] then insert(b_right[t],v) else insert(b_left[t],v);maintain(t,v>=b_key[t]);end;
end;function delete(var t:longint; v:longint):longint;
begindec(b_size[t]);if (b_key[t]=v) or (b_key[t]<v) and (b_right[t]=0) or (b_key[t]>v) and (b_left[t]=0) then begindelete:=b_key[t];if (b_left[t]=0) or (b_right[t]=0) then t:=b_left[t]+b_right[t] else b_key[t]:=delete(b_left[t],v+1);end else if v>b_key[t] then delete:=delete(b_right[t],v) else delete:=delete(b_left[t],v);
end;procedure build(x,l,r:longint);
varmid                            :longint;i                            :longint;
begint[x].left:=l; t[x].right:=r; t[x].root:=0;for i:=l to r do insert(t[x].root,a[i]);if l=r then exit;with t[x] do mid:=(left+right) div 2;build(x*2,l,mid); build(x*2+1,mid+1,r);
end;function b_rank(var t:longint;v:longint):longint;
beginif t=0 then exit(0);if v<=b_key[t] then b_rank:=b_rank(b_left[t],v) else b_rank:=b_rank(b_right[t],v)+b_size[b_left[t]]+1;
end;procedure init;
vari                            :longint;beginread(n,m);for i:=1 to n do read(a[i]);build(1,1,n);
end;function rank(x,l,r,y:longint):longint;
varmid                            :longint;
beginif (t[x].left=l) and (t[x].right=r) then beginrank:=b_rank(t[x].root,y);exit;end;with t[x] do mid:=(left+right) div 2;if mid<l then rank:=rank(x*2+1,l,r,y) else if mid>=r then rank:=rank(x*2,l,r,y) else rank:=rank(x*2,l,mid,y)+rank(x*2+1,mid+1,r,y);
end;procedure askrank(l,r,x:longint);
beginwriteln(rank(1,l,r,x)+1);
end;procedure change(x,y,z,c:longint);
varmid                            :longint;
beginmid:=delete(t[x].root,c);insert(t[x].root,z);if t[x].left=t[x].right then exit;with t[x] do mid:=(left+right) div 2;if y>mid then change(x*2+1,y,z,c) else change(x*2,y,z,c);
end;function b_pred(var t:longint;v:longint):longint;
beginif t=0 then exit(-1);if v<=b_key[t] then b_pred:=b_pred(b_left[t],v) else beginb_pred:=b_pred(b_right[t],v);if b_pred=-1 then b_pred:=b_key[t];end;
end;function pred(x,l,r,y:longint):longint;
varmid                            :longint;
beginif (t[x].left=l) and (t[x].right=r) thenbeginpred:=b_pred(t[x].root,y);exit;end;with t[x] do mid:=(left+right) div 2;if mid<l then pred:=pred(x*2+1,l,r,y) else if mid>=r then pred:=pred(x*2,l,r,y) else pred:=max(pred(x*2,l,mid,y),pred(x*2+1,mid+1,r,y));
end;procedure askpred(l,r,x:longint);
beginwriteln(pred(1,l,r,x));
end;function b_succ(var t:longint;v:longint):longint;
beginif t=0 then exit(maxlongint);if v>=b_key[t] then b_succ:=b_succ(b_right[t],v) else beginb_succ:=b_succ(b_left[t],v);if b_succ=maxlongint then b_succ:=b_key[t];end;
end;function succ(x,l,r,y:longint):longint;
varmid                            :longint;
beginif (t[x].left=l) and (t[x].right=r) thenbeginsucc:=b_succ(t[x].root,y);exit;end;with t[x] do mid:=(left+right) div 2;if mid<l then succ:=succ(x*2+1,l,r,y) else if mid>=r then succ:=succ(x*2,l,r,y) elsesucc:=min(succ(x*2,l,mid,y),succ(x*2+1,mid+1,r,y));
end;procedure askselect(a,b,x:longint);
varmid                            :longint;ans                            :longint;l, r                        :longint;xx                            :longint;
beginl:=0; r:=1000000000;while l<=r do beginmid:=(l+r) div 2;xx:=rank(1,a,b,mid)+1;if xx<=x then beginans:=mid;l:=mid+1;end else r:=mid-1;end;if rank(1,a,b,ans)=x then ans:=succ(1,l,r,ans-1) else ans:=ans;writeln(ans);
end;procedure asksucc(l,r,x:longint);
beginwriteln(succ(1,l,r,x));
end;procedure main;
vari                            :longint;k, l, r, x                    :longint;beginfor i:=1 to m do beginread(k);if k=1 then beginread(l,r,x);askrank(l,r,x);end else if k=2 then beginread(l,r,x);askselect(l,r,x);end elseif k=3 then beginread(l,x);change(1,l,x,a[l]);a[l]:=x;end else if k=4 thenbeginread(l,r,x);askpred(l,r,x);end else if k=5 then beginread(l,r,x);asksucc(l,r,x);end;end;
end;begininit;main;
end.

转载于:https://www.cnblogs.com/BLADEVIL/p/3464216.html

bzoj 3196二逼平衡树 线段树套平衡树相关推荐

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

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

  2. 树套树-线段树套平衡树

    作用 线段树的作用是区间修改和查询,平衡树的作用是查询第k大,k的排名,前驱,后继.这两个结合起来,就变成了可以区间修改和查询第k大,k的排名,前驱,后继的数据结构:树套树-线段树套平衡树. 实现 先 ...

  3. [BZOJ]4605 崂山白花蛇草水 线段树套KD-Tree

    4605: 崂山白花蛇草水 Time Limit: 80 Sec  Memory Limit: 512 MB Submit: 527  Solved: 153 [Submit][Status][Dis ...

  4. 并不对劲的线段树套平衡树

    最近很对劲的太刀流做的一道题中说树是无向连通无环图,并不对劲的片手流为了反驳他,决定与之针锋相对,就练线段无向连通无环图套平衡无向连通无环图的题. 很对劲的太刀流-> 题意非常简单,就是维护一个 ...

  5. 二逼平横树——线段树套平衡树

    注意空间大小,以及建树时的细节 #include<cstdio> #include<algorithm> #include<iostream> using name ...

  6. BZOJ3196 二逼平衡树 ZKW线段树套vector(滑稽)

    我实在是不想再打一遍树状数组套替罪羊树了... 然后在普通平衡树瞎逛的时候找到了以前看过vector题解 于是我想:为啥不把平衡树换成vector呢??? 然后我又去学了一下ZKW线段树 就用ZKW线 ...

  7. 洛谷 P3380 bzoj3196 Tyvj1730 【模板】二逼平衡树(树套树)

    [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数值 查询k在 ...

  8. 二逼平衡树 题解(树套树)

    题面 我 想 扇 死 自 己 void up(int x){if(x){size[x]=cnt[x];//我TM这行忘了if(son[x][0])size[x]+=size[son[x][0]];if ...

  9. 模板:二维线段树(线段树套线段树)

    文章目录 问题 解析 单点修改 询问 完整代码 标记永久化 代码 所谓二维线段树,就是有两个维度的线段树 (逃) 问题 给出一个矩形 要求支持以下操作: 1.询问一个子矩形的最值 2.修改某一个单点的 ...

  10. 【Luogu】P3380树套树模板(线段树套Splay)

    题目链接 幸甚至哉,歌以咏志. 拿下了曾经是那么遥不可及的线段树,学会了曾经高不可攀的平衡树,弄懂了装B的时候才挂在嘴边的树套树. 每道模板都是链上的一颗珠子.把它们挨个串起来,就成为我成长的历程. ...

最新文章

  1. 创建Django项目和模型(创建工程、子应用、设置pycharm环境、使用Django进行数据库开发的步骤)
  2. 流数据分析平台Storm简介
  3. html图片加波浪滤镜,CSS滤镜wave属性(波形滤镜)
  4. DL之AE:自编码器AutoEncoder的简介、应用、经典案例之详细攻略
  5. 约数研究pascal程序
  6. arcgis mxt模板 创建工具条无法保存_【从零开始学GIS】ArcGIS中的绘图基本操作(二)...
  7. 判断元素是否存在(信息学奥赛一本通-T1211)
  8. java cookie secure_Cookie的Secure属性
  9. 【Kafka】kafka KafkaException: Exception while loading Zookeeper JAAS login context ‘Client‘
  10. mysql 创建删除表_mysql创建删除表的的详细解析
  11. mysql 安装和修改编码(utf8mb4)
  12. 字符集在本地化过程中的影响
  13. javacc LOOKAHEAD关键字
  14. 28岁自学3年前端成功转行的励志故事
  15. [Android] [Hybrid APP开发简述]
  16. 读javascript高级程序设计-目录
  17. Golang学习日志 ━━ gin-vue-admin实现多数据库db-list
  18. 【人工智能 AI 2.0】阿里VP贾扬清被曝将离职创业:建大模型基础设施 已火速锁定首轮融资
  19. agd插值算法_多目标自适应和声搜索算法
  20. 【SSL】记录一次PEM转P12证书

热门文章

  1. abstract class和interface有什么区别?_程序员必须掌握了解的21个Java核心技术,还在等什么?...
  2. Ubuntu14.04安装
  3. 统考英语和计算机什么时候出成绩单,网络教育统考成绩啥时候出来
  4. spring是java ee框架吗,Java EE和Spring框架之间的区别
  5. 帆软高级函数应用之数组函数
  6. FR公式形态定义及运用范例
  7. oracle 表复制 long,关于oracle的数据库的数据Long和Number的转化字段
  8. antdesign 所兼容的浏览器_React爬坑之路——Antd兼容IE
  9. 软件工程中需要学习和掌握的软件都有哪些_高三孩子:你想学软件工程,要先知道这些...
  10. Dockerfile 数据卷最佳实践