/*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模版的更多相关文章

  1. 平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】

    平衡树初阶——AVL平衡二叉查找树 一.什么是二叉树 1. 什么是树. 计算机科学里面的树本质是一个树状图.树首先是一个有向无环图,由根节点指向子结点.但是不严格的说,我们也研究无向树.所谓无向树就是 ...

  2. 创建ABPboilerplate模版项目

    本文是根据角落的白板报的<通过ABPboilerplate模版创建项目>一文的学习总结,感谢原文作者角落的白板报. 1 准备 开发环境: Visual Studio 2015 update ...

  3. Idea下用SBT搭建Spark Helloworld

    没用过IDEA工具,听说跟Eclipse差不多,sbt在Idea其实就等于maven在Eclipse.Spark运行在JVM中,所以要在Idea下运行spark,就先要安装JDK 1.8+ 然后加入S ...

  4. 使用boilerplate模版创建解决方案

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 话不多说,让我们开始干吧!对于还没有接触ABP框架或者接触时间还不是很长的小伙伴来说,我建议还是使用官方建议的做法,那就是到ABP ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统(29)-T4模版

    系列目录 本节不再适合本系统,在58,59节已经重构.请超过本节 这讲适合所有的MVC程序 很荣幸,我们的系统有了体验的地址了.演示地址 之前我们发布了一个简单的代码生成器,其原理就是读取数据库的表结 ...

  6. 构建自己的PHP框架--构建模版引擎(1)

    前段时间太忙,导致好久都没有更新博客了,今天抽出点时间来写一篇. 其实这个系列的博客很久没有更新了,之前想好好规划一下,再继续写,然后就放下了,今天再捡起来继续更新. 今天我们来说一下,如何构建自己的 ...

  7. asp.net读取模版并写入文本文件

    本文要介绍的是ASP.NET怎样读写文本文件,但更重要的是实现的过程.使用的工具是Visual Studio 2015 ,.NET版本是4.6.1 .一共建立的2个项目,HoverTreePanel和 ...

  8. [bzoj1269][AHOI2006文本编辑器editor] (splay模版题 or pb_ds [rope]大法)

    Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义:   文本:由0个或 ...

  9. C++ 模版

    函数模版 #include <iostream> using namespace std; template<typename T> T add(T t1, T t2) { r ...

随机推荐

  1. Eclipse 完全 设置UTF-8 环境

    当开始一个新的Java项目时,最好将整个环境设置为UTF-8 一般通过如下几步来设置: 1: 设置工作空间的编码格式:Window -> Preferences -> General -& ...

  2. Android 数据适配器

    把复杂的数据(数组.链表.数据库.集合等)填充到指定的视图界面上.   arrayAdapter(数组适配器):      用于绑定一些格式单一的数据,数据源:数据或者集合.   private Li ...

  3. javascript 学习笔记(权威指南)

    1.数组的sort()方法默认是按照字母排序的,下面举个栗子说明: 1)全是字母: var arr =["zu","fan","an",&q ...

  4. cv2.imread BGR模式

    openCV 的cv2.imread()导入图片时是BGR通道顺序,这与Matplotlib的显示,或者读取图片的通道不同,如果需要可以转换为RGB模式,以下代码显示不同之处,但BGR在许多地方使用, ...

  5. CentOS下Mysql安装调试

    一.安装   yum安装:yum install -y mysql-server mysql mysql-devel 设置自启动:chkconfig mysqld on 启动MySQL:service ...

  6. ubuntu 安装ruby rails

    步骤0 - 安装系统需要的包 Mac 请安装 Xcode 开发工具,它将帮你安装好 Unix 环境需要的开发包 Ubuntu 请安装 $ sudo apt-get install -y build-e ...

  7. 解密电子书之一:电子墨水(eink)

    今日,关于电子书的话题不断,先是盛大抖了个攒,测试/定价/赔钱的营销策略引来多方质疑.而后汉王又抛出个8寸/800MHz/ARM A8的指标产品大打性能牌. 身为电子行业网站,与非网在时尚数码热潮面前 ...

  8. 要不要用STL的问题——真理是越辩越明的~

    QtWidgets的维护者 Marc Mutz 有一篇博客比较详尽的介绍了 Qt自己的容器.介绍了何时用什么比较好https://marcmutz.wordpress.com/effective-qt ...

  9. 扩展C++ string类

    在实际开发过程中,C++string类使用起来有很多不方便的地方,笔者根据根据这些不足简单的扩展了这个类,如增加与数字之间的相互转化和格式化字符串.不足的地方望指正.读者也可以根据自己需求继续扩展. ...

  10. jQuery.fn和jQuery.prototype jquery.extend() jquery.fn.extend()区别介绍

    这里的 jQuery , jQuery.fn , jQuery,fn,init ,jQuery,prototype 都代表什么. 来看下jQuery的源码是怎么样定义的: (function( win ...