SBT模版
/*Author:WNJXYK*/
#include<cstdio>
using namespace std; const int Maxn=;
struct SBT{
int left;
int right;
int size;
int key;
};
SBT tree[Maxn+];
int root,cnt; inline void rotate_l(int &x){
int y=tree[x].right;
tree[x].right=tree[y].left;
tree[y].left=x;
tree[y].size=tree[x].size;
tree[x].size=+tree[tree[x].left].size+tree[tree[x].right].size;
x=y;
} inline void rotate_r(int &x){
int y=tree[x].left;
tree[x].left=tree[y].right;
tree[y].right=x;
tree[y].size=tree[x].size;
tree[x].size=tree[tree[x].left].size++tree[tree[x].right].size;
x=y;
} void maintain(int &x,bool flag){
//printf("MainTain %d\n",x);
if (flag==false){
if (tree[tree[tree[x].left].left].size>tree[tree[x].right].size){
rotate_r(x);
}
else if (tree[tree[tree[x].left].right].size>tree[tree[x].right].size){
rotate_l(tree[x].left);
rotate_r(x);
}else return ;
}else{
if (tree[tree[tree[x].right].right].size>tree[tree[x].left].size){
rotate_l(x);
}else if (tree[tree[tree[x].right].left].size>tree[tree[x].left].size){
rotate_r(tree[x].right);
rotate_l(x);
}else return ;
}
maintain(tree[x].left,false);
maintain(tree[x].right,true);
maintain(x,true);
maintain(x,false);
}
void insert(int &x,int sp){
if (!x){
x=++cnt;
tree[x].left=tree[x].right=;
tree[x].size=;
tree[x].key=sp;
}else{
tree[x].size++;
if (sp<tree[x].key){
insert(tree[x].left,sp);
}else{
insert(tree[x].right,sp);
}
maintain(x,sp>=tree[x].key);
}
} int del(int &x,int sp){
tree[x].size--;
if (sp==tree[x].key || ( sp<tree[x].key && tree[x].left==) || (sp>tree[x].key && tree[x].right==)){
int y=tree[x].key;
if (tree[x].left== ||tree[x].right==){
x=tree[x].left+tree[x].right;
}else{
tree[x].key=del(tree[x].left,tree[x].key+);
}
return y;
}else{
if (sp<tree[x].key){
return del(tree[x].left,sp);
}else{
return del(tree[x].right,sp);
}
}
} inline int getMax(){
int i;
for (i=root;tree[i].right;i=tree[i].right);
return tree[i].key;
} inline int getMin(){
int i;
for (i=root;tree[i].left;i=tree[i].left);
return tree[i].key;
} int rank(int &x,int sp){
if (sp<tree[x].key){
return rank(tree[x].left,sp);
}else if (sp>tree[x].key){
return rank(tree[x].right,sp)+tree[tree[x].left].size+;
}
return tree[tree[x].left].size+;
} int select(int &x,int rak){
int rk=tree[tree[x].left].size+;
if (rak<rk){
return select(tree[x].left,rak);
}else if (rak>rk){
return select(tree[x].right,rak-rk);
}
return tree[x].key;
} int pred(int &x,int y,int sp){
if (x==) return y;
if (tree[x].key<sp){
return pred(tree[x].right,x,sp);
}
return pred(tree[x].left,y,sp);
} int succ(int &x,int y,int sp){
if (x==) return y;
if (tree[x].key>sp){
return succ(tree[x].left,x,sp);
}
return succ(tree[x].right,y,sp);
} inline void init(){
root=cnt=;
} int main(){
init();
return ;
}
SBT模版的更多相关文章
- 平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】
平衡树初阶——AVL平衡二叉查找树 一.什么是二叉树 1. 什么是树. 计算机科学里面的树本质是一个树状图.树首先是一个有向无环图,由根节点指向子结点.但是不严格的说,我们也研究无向树.所谓无向树就是 ...
- 创建ABPboilerplate模版项目
本文是根据角落的白板报的<通过ABPboilerplate模版创建项目>一文的学习总结,感谢原文作者角落的白板报. 1 准备 开发环境: Visual Studio 2015 update ...
- Idea下用SBT搭建Spark Helloworld
没用过IDEA工具,听说跟Eclipse差不多,sbt在Idea其实就等于maven在Eclipse.Spark运行在JVM中,所以要在Idea下运行spark,就先要安装JDK 1.8+ 然后加入S ...
- 使用boilerplate模版创建解决方案
返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 话不多说,让我们开始干吧!对于还没有接触ABP框架或者接触时间还不是很长的小伙伴来说,我建议还是使用官方建议的做法,那就是到ABP ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(29)-T4模版
系列目录 本节不再适合本系统,在58,59节已经重构.请超过本节 这讲适合所有的MVC程序 很荣幸,我们的系统有了体验的地址了.演示地址 之前我们发布了一个简单的代码生成器,其原理就是读取数据库的表结 ...
- 构建自己的PHP框架--构建模版引擎(1)
前段时间太忙,导致好久都没有更新博客了,今天抽出点时间来写一篇. 其实这个系列的博客很久没有更新了,之前想好好规划一下,再继续写,然后就放下了,今天再捡起来继续更新. 今天我们来说一下,如何构建自己的 ...
- asp.net读取模版并写入文本文件
本文要介绍的是ASP.NET怎样读写文本文件,但更重要的是实现的过程.使用的工具是Visual Studio 2015 ,.NET版本是4.6.1 .一共建立的2个项目,HoverTreePanel和 ...
- [bzoj1269][AHOI2006文本编辑器editor] (splay模版题 or pb_ds [rope]大法)
Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义: 文本:由0个或 ...
- C++ 模版
函数模版 #include <iostream> using namespace std; template<typename T> T add(T t1, T t2) { r ...
随机推荐
- Flot chart学习笔记
背景及相关简介 在最近的BS新项目中需要用到绘图数据显示的功能.在进行充足的选择之后决定才去开源的Flot.Flot是一个jQuery绘图库.主要用于简单的绘制图表功能.具有吸引人的渲染外观和互操作的 ...
- Mocha 从0开始
Mocha Mocha 是具有丰富特性的 JavaScript 测试框架,可以运行在 Node.js 和浏览器中,使得异步测试更简单更有趣.Mocha 可以持续运行测试,支持灵活又准确的报告,当映射到 ...
- 接收时必须库存可处理标识为Y
应用 Oracle Inventory 层 Level Function 函数名 Funcgtion Name RCV_RCVRCERC 表单名 Form Name RCVRCERC 说明 Descr ...
- 解决Qt程序发布时中文乱码问题(通过QApplication.addLibraryPath加载QTextCodec插件)
Qt程序的文字编码,是通过插件来解决的,所以我们发布的时候需要把相应的插件也发布出去,在开发者电脑上程序会自动从插件目录加载到插件,但是如果发布给别的电脑使用,需要手动指定插件路径,如下所示: int ...
- ios jsbrige
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- c++多线程编程之互斥对象(锁)的使用之----死锁
一.死锁会在什么情况发生 1.假设有如下代码 mutex; //代表一个全局互斥对象 void A() { mutex.lock(); //这里操作共享数据 B(); //这里调用B方法 mu ...
- javascript第二课javascript规范
1.javascript严格区分大小写 2.声明变量一律使用var 推断类型 3.每条语句后面加分号 4.字符串使用单引号 5.html代码使用双引号,js用单引号
- Solrj日期范围查询
在做依据日期来检索的时候普通的格式化会出错,试了好多种仅仅有一种可行 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH ...
- 二、Cocos2dx中Android部分的c++和java实现相互调用(高级篇)
本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=97 本文目的 要完成在cocos2dx的场景上一个点击事件,传递一个消息到java层,下面让我们看看 ...
- server宕机监控、检測、报警程序(139绑定手机短信报警)monitor_down.sh
宕机监控报警程序 一. 需求来源 宕机对运维人员来说,最痛苦了.怎样检測一台server是否还在正常执行,假设该server宕机,怎样在第一时间监測到并通知一线运维人员进行维护,最大化降低损失. ...