种下一棵树:有旋Treap
第一个平衡树板子,有旋Treap。用随机函数规定一个堆,维护点权的同时维护堆的性质,可以有效地避免退化成链。按我的理解,建立一棵二叉排序树,树的形态会和给出节点的顺序有关。按照出题人很机智定理,数据肯定不会太容易操作,这时候就需要我们自行调整“数据顺序”,平衡树应运而生。
这个板子涵盖的操作有左旋、右旋(维护堆性质)、添加节点、删除节点(建树相关)、查找第x个元素、查找元素排名、查找前驱、查找后继这8种操作。改变树本身的操作都是取地址传参的,询问操作则都是简单传参。原理不是太难理解,应用则看以后刷题了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
using namespace std;
const int sj=;
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==)
{
size++;
x=size;
t[x].size=t[x].w=;
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<t[x].rnd) lturn(x);
}
else
{
cr(t[x].l,y);
if(t[t[x].l].rnd<t[x].rnd) rturn(x);
}
}
void sc(int &k,int x)
{
if(k==) return;
if(t[k].v==x)
{
if(t[k].w>)
{
t[k].w--;
t[k].size--;
return;
}
if(t[k].l*t[k].r==) k=t[k].l+t[k].r;
else if(t[t[k].l].rnd<t[t[k].r].rnd)
rturn(k),sc(k,x);
else
lturn(k),sc(k,x);
}
else if(x>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==) return ;
if(t[k].v==x) return t[t[k].l].size+;
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==) return ;
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==) return;
if(t[k].v<x)
jg=k,query_pre(t[k].r,x);
else query_pre(t[k].l,x);
}
void query_sub(int k,int x)
{
if(k==) 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=;i<=n;i++)
{
scanf("%d%d",&opt,&cs);
if(opt==)
cr(g,cs);
if(opt==)
sc(g,cs);
if(opt==)
printf("%d\n",query_rank(g,cs));
if(opt==)
printf("%d\n",query_num(g,cs));
if(opt==)
{
jg=;
query_pre(g,cs);
printf("%d\n",t[jg].v);
}
if(opt==)
{
jg=;
query_sub(g,cs);
printf("%d\n",t[jg].v);
}
}
//while(1);
return ;
}
种下一棵树:有旋Treap的更多相关文章
- 平衡树简单教程及模板(splay, 替罪羊树, 非旋treap)
原文链接https://www.cnblogs.com/zhouzhendong/p/Balanced-Binary-Tree.html 注意是简单教程,不是入门教程. splay 1. 旋转: 假设 ...
- 替罪羊树&&非旋treap
题解: 替罪羊树的模板和splay差距还是比较大的.. 按照我的splay的写法 真是都是问题.. 替罪羊树就是暴力的搞 当某颗子树大小大于这棵树的alpha时 就退出 另外删除的时候打懒标记删除 当 ...
- [转载]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
转载自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182491.html 今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和t ...
- [您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和treap一样简单易懂,同时还支持可持久化. 无旋treap的节点定义和treap一样,都要同时满足树性质和堆性质,我 ...
- 2017年陕西省网络空间安全技术大赛——种棵树吧——Writeup
2017年陕西省网络空间安全技术大赛——种棵树吧——Writeup 下载下来的zip解压得到两个jpg图片,在Kali中使用binwalk查看文件类型如下图: 有两个发现: 1111.jpg 隐藏了一 ...
- [模板] 平衡树: Splay, 非旋Treap, 替罪羊树
简介 二叉搜索树, 可以维护一个集合/序列, 同时维护节点的 \(size\), 因此可以支持 insert(v), delete(v), kth(p,k), rank(v)等操作. 另外, prev ...
- Trees in a Wood. UVA 10214 欧拉函数或者容斥定理 给定a,b求 |x|<=a, |y|<=b这个范围内的所有整点不包括原点都种一棵树。求出你站在原点向四周看到的树的数量/总的树的数量的值。
/** 题目:Trees in a Wood. UVA 10214 链接:https://vjudge.net/problem/UVA-10214 题意:给定a,b求 |x|<=a, |y|&l ...
- 非旋treap套线段树
BZOJ3065. 去年用pascal 块链过了.. 今年来试了试非旋treap大法 注定被块链完爆 代码留这. 第一份 :辣鸡的 垃圾回收做法 跑得极慢 #include <bits/ ...
- [转载]无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )
转自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182631.html 1500: [NOI2005]维修数列 Time Limit: 10 Sec Mem ...
随机推荐
- oracle数据库的编码
--oracle数据库的编码select * from nls_database_parameters where parameter ='NLS_CHARACTERSET';--oracle客户端编 ...
- 如果导入的项目只有源码,可以将其他项目中的.classpath 和 .project复制到根目录下即可。
如果导入的项目只有源码,没有对应的项目配置如web项目,可以将其他项目中的.classpath 和 .project复制到根目录下即可.
- PHP以星号隐藏用户名手机和邮箱
<?php class Hidesatr{ function hide_star_do($str) { //用户名.邮箱.手机账号中间字符串以*隐藏 if (strpos($str, '@')) ...
- 使用Scribefire在博客中插入语法高亮 II
效果如下, 这是我们在Scribefire中添加的code按钮,单击此按钮,则会出现 在codeHere中直接输入代码就可以了. 查看html 可以看到,其中已经添加了<pre>标签. 下 ...
- 正则表达式获取body内容
最近项目需要,要弄个正则表达式获取body的内容. 用过angularjs就知道,很多时候要写指令时引用templateUrl的时候.template的内容root是不能包含多个节点的,否则就报错. ...
- C# 来做 视频播放 视频流处理 转码 实时传输
最近一直在研究视频实时查看播放 很遗憾 只成功了一半 记录一下历程 以便大家相互交流 项目需求是 GPS 视频设备 连接服务器 将视频流走RTP 协议发送到服务器 服务器将接收的视频流 传输给 ...
- React周末特训班
Document #react819_content a { text-decoration: none; color: #ef7b2e; border-bottom: 1px solid #ef7b ...
- 大数据平台搭建-kafka集群的搭建
本系列文章主要阐述大数据计算平台相关框架的搭建,包括如下内容: 基础环境安装 zookeeper集群的搭建 kafka集群的搭建 hadoop/hbase集群的搭建 spark集群的搭建 flink集 ...
- Struts框架之 执行流程 struts.xml 配置详细
1.执行流程 服务器启动: 1. 加载项目web.xml 2. 创建Struts核心过滤器对象, 执行filter → init() struts-default.xml, 核心功能的初 ...
- JavaScript实现淡入淡出
<!DOCTYPE html> <html> <head> <title>css动画</title> </head> <b ...