/*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. javascript prompt示例

    <html lang="en"> <head>   <title>Date example</title> <script t ...

  2. asp.net mvc 不找其他view模板,只找cshtml

    asp.net mvc 默认找view文件时,依次找后辍名为aspx.ascx.cshtml.vbhtml的view文件.但是项目住住用C#+Razor开发,这样找,岂不有性能损失. 添加以下代码: ...

  3. 添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)

    添加EF上下文对象,添加接口.实现类以及无处不在的依赖注入(DI) 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 上一章,我们介绍了安装和新建控制器.视图,这一章我们来创建 ...

  4. [方法] ubuntu12.04开启root账户

    ubuntu 12.04使用LightDM显示管理器,默认禁止root账户登录. 通过修改/etc/lightdm/lightdm.con文件可以打开root登录权限. 方法很简单,只要在lightd ...

  5. Unix/Linux环境C编程入门教程(16) LinuxMint CCPP开发环境搭建

    1. Linux Mint由Linux Mint Team团队于2006年开始发行,是一份基于 这个时候linuxmint安装完成,C/C++开发环境也配置完成,希望大家认真实践!

  6. CodeForces - 61E Enemy is weak

    Description The Romans have attacked again. This time they are much more than the Persians but Shapu ...

  7. 值得赞扬的尝试与进步——CSDN开源夏令营第一印象

    注:写这篇文章时我并未參加CSDN开源夏令营,也不确定是否会參加以及是否能參加上. 欣闻CSDN举办了"CSDN开源夏令营"活动.第一感觉是CSDN作为活动的组织者是很值得称赞的. ...

  8. Android Json生成及解析实例

    JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...

  9. 我的学习笔记之API-Guides翻译------AppComponent_Activites

    10.26第一天开始:贵在坚持,边看遍整理 一个应用程序通常由多个Activity组成,它们之间是松耦合的关系.特别的,有一个Activity作为app的主Activity,当app首次启动时呈现给用 ...

  10. BroadcastReceiver自学笔记

    1. 使用步骤:  1.1 声明Intent Intent intent = new Intent("name");------静态常用 IntentFilter filter = ...