博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
种下一棵树:有旋Treap
阅读量:7245 次
发布时间:2019-06-29

本文共 2227 字,大约阅读时间需要 7 分钟。

       第一个平衡树板子,有旋Treap。用随机函数规定一个堆,维护点权的同时维护堆的性质,可以有效地避免退化成链。按我的理解,建立一棵二叉排序树,树的形态会和给出节点的顺序有关。按照出题人很机智定理,数据肯定不会太容易操作,这时候就需要我们自行调整“数据顺序”,平衡树应运而生。

       这个板子涵盖的操作有左旋、右旋(维护堆性质)、添加节点、删除节点(建树相关)、查找第x个元素、查找元素排名、查找前驱、查找后继这8种操作。改变树本身的操作都是取地址传参的,询问操作则都是简单传参。原理不是太难理解,应用则看以后刷题了。

#include
#include
#include
#include
#include
using namespace std;const int sj=100010;int n,opt,g,jg,cs,size;struct tree{ int l,r,v,w,rnd,size;}t[sj];void update(int x){ t[x].size=t[t[x].l].size+t[t[x].r].size+t[x].w;}void lturn(int &x){ int tt=t[x].r; t[x].r=t[tt].l; t[tt].l=x; t[tt].size=t[x].size; update(x); x=tt;}void rturn(int &x){ int tt=t[x].l; t[x].l=t[tt].r; t[tt].r=x; t[tt].size=t[x].size; update(x); x=tt;}void cr(int &x,int y){ if(x==0) { size++; x=size; t[x].size=t[x].w=1; t[x].v=y; t[x].rnd=rand(); return; } t[x].size++; if(t[x].v==y) t[x].w++; else if(y>t[x].v) { cr(t[x].r,y); if(t[t[x].r].rnd
1) { t[k].w--; t[k].size--; return; } if(t[k].l*t[k].r==0) k=t[k].l+t[k].r; else if(t[t[k].l].rnd
t[k].v) t[k].size--,sc(t[k].r,x); else t[k].size--,sc(t[k].l,x);}int query_rank(int k,int x){ if(k==0) return 0; if(t[k].v==x) return t[t[k].l].size+1; else if(x>t[k].v) return t[t[k].l].size+t[k].w+query_rank(t[k].r,x); else return query_rank(t[k].l,x);}int query_num(int k,int x){ if(k==0) return 0; if(x<=t[t[k].l].size) return query_num(t[k].l,x); else if(x>t[t[k].l].size+t[k].w) return query_num(t[k].r,x-t[t[k].l].size-t[k].w); else return t[k].v;}void query_pre(int k,int x){ if(k==0) return; if(t[k].v
x) jg=k,query_sub(t[k].l,x); else query_sub(t[k].r,x);}int main(){ //freopen("t.txt","r",stdin); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&opt,&cs); if(opt==1) cr(g,cs); if(opt==2) sc(g,cs); if(opt==3) printf("%d\n",query_rank(g,cs)); if(opt==4) printf("%d\n",query_num(g,cs)); if(opt==5) { jg=0; query_pre(g,cs); printf("%d\n",t[jg].v); } if(opt==6) { jg=0; query_sub(g,cs); printf("%d\n",t[jg].v); } } //while(1); return 0;}

 

转载于:https://www.cnblogs.com/moyiii-/p/7241788.html

你可能感兴趣的文章
代码清单3-10 一个完整的泛型枚举——从0枚举到9
查看>>
myeclipse 编码问题
查看>>
POJ1637 Sightseeing Tour
查看>>
spring数据绑定默认的日期解析格式解析不了yyyy格式
查看>>
poi 下拉框实现
查看>>
百度地图通过地址得到经纬度
查看>>
ubuntu环境部署项目
查看>>
BZOJ 1017 魔兽地图DotR(树形DP)
查看>>
ecshop价格区间导航
查看>>
有时间可研究的题目
查看>>
3Sum
查看>>
vue -- 项目打包优化
查看>>
React实践debug:JSX输出的限制(存疑)
查看>>
Dapper.Rainbow 简单使用
查看>>
web基础
查看>>
Spring 5 新特性:函数式Web框架
查看>>
IoC
查看>>
微软视频学习
查看>>
第三章:垃圾回收器-G1收集器
查看>>
XML 和 List 互转类
查看>>