二次联通门 : luogu P3369 【模板】普通平衡树(Treap/SBT)

闲的没事,把各种平衡树都写写

比较比较。。。

下面是替罪羊树

#include <cstdio>
#include <vector> #define Max_ 100010 #define Inline __attri\
bute__( ( optimize( "-O2" ) ) ) Inline void read (int &now)
{
register char word = getchar ();
bool temp = false;
for (now = ; word < '' || word > ''; word = getchar ())
if (word == '-')
temp = true;
for (; word >= '' && word <= ''; now = now * + word - '', word = getchar ());
if (temp)
now = -now;
} const double alpha = 0.63; int N; struct G_D
{
G_D *child[]; int key;
int size, total;
bool is_exist; inline void Up ()
{
this->size = this->child[]->size + this->child[]->size + is_exist;
this->total = this->child[]->total + this->child[]->total + ;
} inline bool is_rebuild ()
{
return ((this->child[]->total > this->total * alpha + ) || (this->child[]->total > this->total * alpha + ));
}
}; class Scapegoat_Tree_Type
{ private : G_D poor_mem[Max_];
G_D *Root, *Tail, *null; G_D *reuse[Max_];
int Reuse_top; Inline G_D *New_Node (int key)
{
G_D *now = Reuse_top ? reuse[-- Reuse_top] : Tail ++;
now->child[] = now->child[] = null;
now->size = now->total = ;
now->is_exist = true;
now->key = key;
return now;
} Inline void Travel (G_D *now, std :: vector <G_D *> &line)
{
if (now == null)
return ;
Travel (now->child[], line);
if (now->is_exist)
line.push_back (now);
else
reuse[Reuse_top ++] = now;
Travel (now->child[], line);
} Inline G_D *Divide (std :: vector <G_D *> &line, int l, int r)
{
if (l >= r)
return null;
int Mid = (l + r) >> ;
G_D *now = line[Mid];
now->child[] = Divide (line, l, Mid);
now->child[] = Divide (line, Mid + , r);
now->Up ();
return now;
} Inline void Re_Build (G_D *&now)
{
static std :: vector <G_D *> line;
line.clear ();
Travel (now, line);
now = Divide (line, , line.size ());
} Inline G_D **Insert (G_D *&now, int key)
{
if (now == null)
{
now = New_Node (key);
return &null;
}
else
{
now->size ++;
now->total ++;
G_D **res = Insert (now->child[key >= now->key], key);
if (now->is_rebuild ())
res = &now;
return res;
}
} Inline void Erase (G_D *now, int pos)
{
now->size --;
int res = now->child[]->size + now->is_exist;
if (now->is_exist && pos == res)
{
now->is_exist = false;
return ;
}
else
{
if (pos <= res)
Erase (now->child[], pos);
else
Erase (now->child[], pos - res);
}
} public : Scapegoat_Tree_Type ()
{
Tail = poor_mem;
null = Tail ++;
null->child[] = null->child[] = null;
null->total = null->size = null->key = ; Root = null;
Reuse_top = ;
} Inline void Insert (int key)
{
G_D **now = this->Insert (Root, key);
if (*now != null)
Re_Build (*now);
} Inline int Get_Rank (int key)
{
G_D *now = Root;
register int Answer = ;
for (; now != null; )
{
if (now->key >= key)
now = now->child[];
else
{
Answer += now->child[]->size + now->is_exist;
now = now->child[];
}
}
return Answer;
} Inline int Get_kth_number (int k)
{
int Count = ;
for (G_D *now = Root; now != null; )
{
if (now->child[]->size + == k && now->is_exist)
return now->key;
else if (now->child[]->size >= k)
now = now->child[];
else
{
k -= now->child[]->size + now->is_exist;
now = now->child[];
}
}
} Inline void Erase (int pos)
{
Erase (Root, Get_Rank (pos));
if (Root->size < alpha * Root->total)
Re_Build (Root);
} }; Scapegoat_Tree_Type Tree; int M;
int main (int argc, char *argv[])
{ read (M); for (int type, x; M --; )
{
read (type);
read (x); switch (type)
{
case :
Tree.Insert (x);
break;
case :
Tree.Erase (x);
break;
case :
printf ("%d\n", Tree.Get_Rank (x));
break;
case :
printf ("%d\n", Tree.Get_kth_number (x));
break;
case :
printf ("%d\n", Tree.Get_kth_number (Tree.Get_Rank (x) - ));
break;
case :
printf ("%d\n", Tree.Get_kth_number (Tree.Get_Rank (x + )));
break;
}
} return ;
}

替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)的更多相关文章

  1. luoguP3369[模板]普通平衡树(Treap/SBT) 题解

    链接一下题目:luoguP3369[模板]普通平衡树(Treap/SBT) 平衡树解析 #include<iostream> #include<cstdlib> #includ ...

  2. 替罪羊树—BZOJ3224: Tyvj 1728 普通平衡树

    冬令营被平衡树坑了之后,打算苦练一番数据结构(QAQ). 先是打了一下想学好久的替罪羊树. 替罪羊树实现方法很简单,就是在不满足平衡条件的时候暴力重构子树. 调试小结: 1.删除操作分两类情况:如果某 ...

  3. 【模板】平衡树——Treap和Splay

    二叉搜索树($BST$):一棵带权二叉树,满足左子树的权值均小于根节点的权值,右子树的权值均大于根节点的权值.且左右子树也分别是二叉搜索树.(如下) $BST$的作用:维护一个有序数列,支持插入$x$ ...

  4. 简析平衡树(一)——替罪羊树 Scapegoat Tree

    前言 平衡树在我的心目中,一直都是一个很高深莫测的数据结构.不过,由于最近做的题目的题解中经常出现"平衡树"这三个字,我决定从最简单的替罪羊树开始,好好学习平衡树. 简介 替罪羊树 ...

  5. BZOJ - 3224 Tyvj 1728 普通平衡树 (treap/树状数组)

    题目链接 treap及树状数组模板题. treap版: #include<bits/stdc++.h> using namespace std; typedef long long ll; ...

  6. 「BZOJ3600」没有人的算术 替罪羊树+线段树

    题目描述 过长--不想发图也不想发文字,所以就发链接吧-- 没有人的算术 题解 \(orz\)神题一枚 我们考虑如果插入的数不是数对,而是普通的数,这就是一道傻题了--直接线段树一顿乱上就可以了. 于 ...

  7. [luogu P3369]【模板】普通平衡树(Treap/SBT)

    [luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...

  8. 红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 近几天闲来无事...就把各种平衡树都写了一下... 下面是红黑树(Red Black Tree) 喜闻乐见拿到了luo ...

  9. 平衡树简单教程及模板(splay, 替罪羊树, 非旋treap)

    原文链接https://www.cnblogs.com/zhouzhendong/p/Balanced-Binary-Tree.html 注意是简单教程,不是入门教程. splay 1. 旋转: 假设 ...

随机推荐

  1. git clone一个仓库下的单个文件【记录】

    注意:本方法会下载整个项目,但是,最后出现在本地项目文件下里只有需要的那个文件夹存在.类似先下载,再过滤. 有时候因为需要我们只想gitclone 下仓库的单个或多个文件夹,而不是全部的仓库内容,这样 ...

  2. golang ---获取磁盘信息

    package main import ( "fmt" "github.com/StackExchange/wmi" ) type Storage struct ...

  3. The three day 给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本

    """ 给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本. 所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 ...

  4. 记录:拷贝gitblit里的项目使用git命令clone、pull、push等,出现一直在加载,卡住没反应的问题

    俺想克隆别人gitblit里的其中一个版本库(俺在别人gitblit有权限) 懂得git的道友们,都应该知道克隆一个公共项目,随便找到,打开git终端,输入git clone 项目地址就行了 到了俺这 ...

  5. IdentityServer4实现Oauth2.0四种模式之隐藏模式

      接上一篇:IdentityServer4实现OAuth2.0四种模式之密码模式,密码模式将用户的密码暴露给了客户端,这无疑是不安全的,隐藏模式可以解决这个问题,由用户自己在IdentityServ ...

  6. 使用requests简单的页面爬取

    首先安装requests库和准备User Agent 安装requests直接使用pip安装即可 pip install requests 准备User Agent,直接在百度搜索"UA查询 ...

  7. PreparedStatement和批处理

    1.概述 PreparedStatement 接口继承了 Statement,并与之在两方面有所不同,它表示预编译的 SQL 语句对象. 首先,数据库会对预编译语句提供性能优化.因为预编译语句有可能被 ...

  8. Dubbo -- 四种loadBalance负载均衡算法

    Dubbo中的一个关键接口LoadBalance,dubbo是按照其中的规则来调用多台provider的服务的. 先看一下接口的实现类图: 从上图中我们可以看到dubbo提供了四种算法来实现负载均衡. ...

  9. 装饰器带类参数 & 一个函数应用多个装饰器

    装饰器:不改变原函数的基础上,给函数增加功能的方式,称为装饰器 即:为已经存在的对象添加额外的功能 装饰器其实就是一个闭包,把一个函数当做参数后返回一个替代版的函数 decos.py:(装饰器的参数类 ...

  10. SpringBoot+SpringCloud+vue+Element开发项目——集成MyBatis框架

    添加mybatis-spring-boot-starter依赖 pox.xml <!--mybatis--> <dependency> <groupId>org.m ...