怕被学弟怼 : "你的博客上没有Treap模板啊?"

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
const int maxn = 200010;
struct Node{
Node *ch[2];
int siz,w,fix;
void update(){
siz = ch[0]->siz + ch[1]->siz + 1;
}
};
struct Treap{
Node mem[maxn];
Node *tail,*root,*null;
Node *bc[maxn];int top;
Treap(){
tail = mem;null = tail++;
null->ch[0] = null->ch[1] = null;
null->siz = null->w = 0;null->fix = 0x7f7f7f7f;
root = null;
}
Node* newNode(int key){
Node *p = top ? bc[top--] : tail++;
p->ch[0] = p->ch[1] = null;
p->siz = 1;p->w = key;p->fix = rand();
return p;
}
void del(Node* &p){
bc[++top] = p;
p = null;
}
void turn(Node* &p,int k){
Node *y = p->ch[k^1];
p->ch[k^1] = y->ch[k];
y->ch[k] = p;
y->siz = p->siz;
p->update();p = y;
}
int val;
void Insert(Node* &p){
if(p == null){
p = newNode(val);
return;
}
p->siz++;
Insert(p->ch[val >= p->w]);
if(p->ch[val >= p->w]->fix < p->fix)
turn(p,val < p->w);
}
void Insert(int x){
val = x;
Insert(root);
}
void Erase(Node* &p){
if(val == p->w){
if(p->ch[0] != null && p->ch[1] != null){
int k = p->ch[0]->fix >= p->ch[1]->fix;
turn(p,k);
Erase(p->ch[k]);
}else{
Node *y = p->ch[0] == null ? p->ch[1] : p->ch[0];
del(p);p = y;
}
}else Erase(p->ch[val >= p->w]);
if(p != null) p->update();
}
void Erase(int x){
val = x;
Erase(root);
}
int Kth(int k){
Node *nw = root;
while(nw != null){
if(nw->ch[0]->siz + 1 == k) return nw->w;
if(nw->ch[0]->siz + 1 > k) nw = nw->ch[0];
else k -= nw->ch[0]->siz + 1,nw = nw->ch[1];
}
}
int rank(int x){
int ret = 1;
Node *nw = root;
while(nw != null){
if(x <= nw->w) nw = nw->ch[0];
else{
ret += nw->ch[0]->siz + 1;
nw = nw->ch[1];
}
}return ret;
}
}*zs = new Treap();
int main(){
srand(666);
int n;read(n);
int opt,x;
while(n--){
read(opt);read(x);
switch(opt){
case 1:
zs->Insert(x);
break;
case 2:
zs->Erase(x);
break;
case 3:
printf("%d\n",zs->rank(x));
break;
case 4:
printf("%d\n",zs->Kth(x));
break;
case 5:
printf("%d\n",zs->Kth(zs->rank(x)-1));
break;
case 6:
printf("%d\n",zs->Kth(zs->rank(x+1)));
break; }
}
getchar();getchar();
return 0;
}

普通平衡树 - Treap的更多相关文章

  1. hiho #1325 : 平衡树·Treap

    #1325 : 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? ...

  2. hiho一下103周 平衡树·Treap

    平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二 ...

  3. 算法模板——平衡树Treap 2

    实现功能:同平衡树Treap 1(BZOJ3224 / tyvj1728) 这次的模板有了不少的改进,显然更加美观了,几乎每个部分都有了不少简化,尤其是删除部分,这个参照了hzwer神犇的写法,在此鸣 ...

  4. 【山东省选2008】郁闷的小J 平衡树Treap

    小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所郁闷的.具体说来,书架由N ...

  5. Hihocoder 1325 平衡树·Treap(平衡树,Treap)

    Hihocoder 1325 平衡树·Treap(平衡树,Treap) Description 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二叉 ...

  6. HihoCoder 1325 平衡树·Treap

    HihoCoder 1325 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说 ...

  7. 普通平衡树Treap(含旋转)学习笔记

    浅谈普通平衡树Treap 平衡树,Treap=Tree+heap这是一个很形象的东西 我们要维护一棵树,它满足堆的性质和二叉查找树的性质(BST),这样的二叉树我们叫做平衡树 并且平衡树它的结构是接近 ...

  8. HihoCoder1325 : 平衡树·Treap(附STL版本)

    平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二 ...

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

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

  10. 2021.12.06 平衡树——Treap

    2021.12.06 平衡树--Treap https://www.luogu.com.cn/blog/HOJQVFNA/qian-xi-treap-ping-heng-shu 1.二叉搜索树 1.1 ...

随机推荐

  1. Vosio秘钥

    C2FG9-N6J68-H8BTJ-BW3QX-RM3B32NYF6-QG2CY-9F8XC-GWMBW-29VV8FJ2N7-W8TXC-JB8KB-DCQ7Q-7T7V3VXX6C-DN3HQ-3 ...

  2. Linux Shell基础 Shell基本知识

    概述 在 Linux 的脚本中,只要是基于 Bash语法写的Shell脚本第一行必须是"#!/bin/bash",用来声明此文件是一个脚本. 运行方式 Shell 脚本的运行主要有 ...

  3. eclipse修改项目默认编码为UTF-8

    1.windows->Preferences...打开"首选项"对话框,左侧导航树,导航到general->Workspace,右侧 Text file encodin ...

  4. NAS、SAN、DAS 说明

    NAS 说明 1.NAS(Network Attached Storage:网络附属存储) 2.NAS 是一种采用直接与网络介质相连的特殊设备实现数据存储的机制. 3.NAS本身能够支持多种协议(如N ...

  5. 根据Django后台的ajax大全

    一.什么是ajax 1.1 什么是JSON? AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语 ...

  6. OC_链表实现队列

    @interface Node : NSObject @property(nonatomic,strong)NSString *value; @property(nonatomic,strong)No ...

  7. Python 数值类型

    1.数值类型分为整形(二进制(0b),八进制(0o),十进制,十六进制(0x) ),浮点型,long,complex(复合行) 当我们说十进制数的时候,是逢10进1,就是说到达10的时候就要向前一位进 ...

  8. java-Object类中的方法

    1.Object类中有哪些方法? protected Object  clone():创建一个返回此对象的副本 boolean  equals(Obejct obj):只是其他对象与此对象是否相等 p ...

  9. mybatis 一对多和多对一

      在学习MyBatis3的过程中,文档上面一直在强调一个id的东西!在做这个实验的时候,也因为没有理解清楚id含义而导致一对多的“多”中也只有一条数据.id和result的唯一不同是id表示的结果将 ...

  10. Hadoop的Docker镜像构建

    1.Dockerfile ###Dockerfile -- beagin FROM ubuntu:trusty #MAINTAINER The Hue Team "https://githu ...