fhq Treap(无旋Treap)
时间:2019-06-13
本文章向大家介绍fhq Treap(无旋Treap),主要包括fhq Treap(无旋Treap)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
先吹一波fhq dalao,竟然和我一个姓,我真是给他丢脸。
昨天treap就搞了一下午,感觉自己弱爆了。然后今天上午又看了一个上午的无旋treap再次懵逼,我太弱了,orzorz。
所以写个博客防止自己忘了吧(其实就是贴个代码)。
其实fhq treap中最重要的操作就是split和merge,这样就避免了普通treap中的zig和zag,而且各种查询十分方便,基本查个排名就出来了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #include<vector> 7 using namespace std; 8 const int N=1e5+10; 9 int root,tot; 10 struct Treap{ 11 int l,r,dat,val,size; 12 }tr[N]; 13 void update(int p){tr[p].size=tr[tr[p].l].size+tr[tr[p].r].size+1;} 14 int New(int val){ 15 int x=++tot; 16 tr[x].val=val; 17 tr[x].dat=rand(); 18 tr[x].size=1; 19 return x; 20 } 21 void merge(int &root,int a,int b){ 22 if(!a||!b){ 23 root=a+b; 24 return ; 25 } 26 if(tr[a].dat<tr[b].dat){//a shi baba 27 root=a; 28 merge(tr[root].r,tr[a].r,b); 29 } 30 else{ 31 root=b; 32 merge(tr[root].l,a,tr[b].l); 33 } 34 update(root); 35 } 36 void split(int x,int &a,int &b,int val){ 37 if(!x){ 38 a=b=0; 39 return ; 40 } 41 if(tr[x].val<=val){ 42 a=x; 43 split(tr[x].r,tr[a].r,b,val); 44 } 45 else{ 46 b=x; 47 split(tr[x].l,a,tr[b].l,val); 48 } 49 update(x); 50 } 51 int getrankbyval(int &root,int val){ 52 int x=0,y=0; 53 split(root,x,y,val-1); 54 int ans=tr[x].size+1; 55 merge(root,x,y); 56 return ans; 57 } 58 int getvalbyrank(int &root,int rank){ 59 int x=root; 60 while(tr[tr[x].l].size+1!=rank){ 61 if(rank<=tr[tr[x].l].size) x=tr[x].l; 62 else rank-=(tr[tr[x].l].size+1),x=tr[x].r; 63 } 64 return tr[x].val; 65 } 66 void insert(int &root,int val){ 67 int x=0,y=0; 68 split(root,x,y,val); 69 merge(x,x,New(val)); 70 merge(root,x,y); 71 } 72 void remove(int &root,int val){ 73 int x=0,y=0,z=0; 74 split(root,x,y,val); 75 split(x,x,z,val-1); 76 merge(z,tr[z].l,tr[z].r); 77 merge(x,x,z); 78 merge(root,x,y); 79 } 80 int pre(int &root,int val){ 81 int x=0,y=0; 82 split(root,x,y,val-1); 83 int ans=getvalbyrank(x,tr[x].size); 84 merge(root,x,y); 85 return ans; 86 } 87 int next(int &root,int val){ 88 int x=0,y=0; 89 split(root,x,y,val); 90 int ans=getvalbyrank(y,1); 91 merge(root,x,y); 92 return ans; 93 } 94 int main(){ 95 int n; 96 scanf("%d",&n); 97 for(int i=1;i<=n;i++){ 98 int opt,x; 99 scanf("%d%d",&opt,&x); 100 if(opt==1) insert(root,x); 101 else if(opt==2) remove(root,x); 102 else if(opt==3) printf("%d\n",getrankbyval(root,x)); 103 else if(opt==4) printf("%d\n",getvalbyrank(root,x)); 104 else if(opt==5) printf("%d\n",pre(root,x)); 105 else if(opt==6) printf("%d\n",next(root,x)); 106 } 107 }
明天考试,我好慌,我好慌。
马上分机房,我肯定去菜机房了,我好慌,我好慌。
加油吧,为了自己的梦想
Mi corazón pertenece a Barcelona para siempre.
原文地址:https://www.cnblogs.com/leom10/p/11015089.html
- 如何做一个小程序口令红包功能
- 使用思维导图,优雅的完成自己的代码
- 移动端布局攻略
- nginx反向代理https网站 并实现网站的注册和登录功能
- 通过nginx GeoIP模块 限制某些国家地区访问网站
- CDN加速下通过nginx获取网站访客真实ip
- linux centos7服务器使用密钥登录ssh同时禁止root密码登录
- linux nginx服务器安装verynginx防止CC攻击
- linux nginx安装HttpGuard防止CC攻击
- wordpress您的主机禁用了mail()函数 SMTP邮件通知解决方法
- 我的编程之路:知识管理与知识体系
- UTF-8 为什么会比 UTF-16 浪费?
- 码农也要学算法
- 19 个常用的 JavaScript 简写方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法