非旋转 treap
时间:2019-11-30
本文章向大家介绍非旋转 treap ,主要包括非旋转 treap 使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
其实之前学过一次非旋转 treap,但是全忘光了,今天复习一下.
洛谷 P3369 【模板】普通平衡树
code:
#include <bits/stdc++.h> #define N 100006 #define lson t[x].ls #define rson t[x].rs #define setIO(s) freopen(s".in","r",stdin) using namespace std; int root; namespace treap { int tot; struct node { int val,size,ls,rs,ran; }t[N]; inline void newnode(int &x,int val) { ++tot; t[tot].size=1; t[tot].val=val; t[tot].ran=rand(); t[tot].ls=t[tot].rs=0; x=tot; } inline void pushup(int x) { t[x].size=t[lson].size+t[rson].size+1; } void split(int x,int &l,int &r,int val) { if(!x) { l=r=0; return; } if(t[x].val<=val) l=x, split(t[x].rs,t[l].rs,r,val); else r=x, split(t[x].ls,l,t[r].ls,val); pushup(x); } void merge(int &x,int a,int b) { if(!a||!b) { x=a+b; return; } if(t[a].ran<t[b].ran) x=a, merge(t[x].rs,t[a].rs,b); else x=b, merge(t[x].ls,a,t[b].ls); pushup(x); } void insert(int val) { int x=0,y=0,z=0; newnode(z,val); split(root,x,y,val-1); merge(x,x,z); merge(root,x,y); } void del(int val) { int x=0,y=0,z=0; split(root,x,y,val); split(x,x,z,val-1); merge(z,t[z].ls,t[z].rs); merge(x,x,z); merge(root,x,y); } void ask_rank(int v) { int x=0,y=0; split(root,x,y,v-1); printf("%d\n",t[x].size+1); merge(root,x,y); } void ask_num(int x,int kth) { while(t[lson].size+1!=kth) { if(t[lson].size>=kth) x=lson; else kth-=(t[lson].size+1),x=rson; } printf("%d\n",t[x].val); } void ask_front(int v) { int x=0,y=0; split(root,x,y,v-1); ask_num(x,t[x].size); merge(root,x,y); } void ask_back(int v) { int x=0,y=0; split(root,x,y,v),ask_num(y,1), merge(root,x,y); } }; int main() { // setIO("input"); int i,j,n; srand(16); scanf("%d",&n); for(i=1;i<=n;++i) { int opt,x; scanf("%d%d",&opt,&x); if(opt==1) treap::insert(x); if(opt==2) treap::del(x); if(opt==3) treap::ask_rank(x); if(opt==4) treap::ask_num(root,x); if(opt==5) treap::ask_front(x); if(opt==6) treap::ask_back(x); } return 0; }
原文地址:https://www.cnblogs.com/guangheli/p/11961510.html
- JavaScript 性能优化技巧分享
- 一个拷贝操作导致的潜在监听类问题(r9笔记第70天)
- Java基础-day05-基础题
- 【Go 语言社区算法课程 第一季 第3节 hash算法实现
- mongodb11天之屠龙宝刀(四)高级查询:MongoDB内嵌字段查询
- merge语句导致的ORA错误分析(r9笔记第67天)
- Go语言的单例模式(Singleton)
- DPDK 全面分析
- 关于Go语言中数组的参数传递问题
- 【深度学习系列】用PaddlePaddle进行车牌识别(一)
- GO语言-new()分配与构造和初始化结构
- Java基础-day05-超市收银系统案例题
- mongodb11天之屠龙宝刀(五)lbs地理位置检索:存储经纬度以及查询
- 【深度学习系列】关于PaddlePaddle的一些避“坑”技巧
- 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 数组属性和方法
- Java自动化测试(特殊元素处理 26)
- Java自动化测试(web自动化测试框架 28)
- 你想要拥有自己的搜索引擎吗?
- JAVA三年面试总结,金九银十,你准备好了吗?
- Best Cow Line(POJ 3617)
- Flask单点登录竟然只要几行代码就能搞定!
- 区间调度问题
- 迷宫的最短路径
- Lake Counting (POJ No.2386)
- 部分和问题(DFS)
- 为什么 React Hooks useState 更新不符预期?
- 技术分享 | MySQL 使用 MariaDB 审计插件
- 第12期:压缩表性能监测
- 第05期:使用 prometheus 监控 clickhouse 集群
- 这 6 点知识让我对 JavaScript 的对象有了更进一步的了解