treap完全版模板

这是我综合poj1442 3481 2352的treap操作 得到treap完全版模板。(经测AC)

从NOCOW——Treap中一份代码中模仿加工精致而成。

结构体Tree

{

  int key; //键值

  int size; //该子树总节点个数

  int pri; //其随机值

  int son[2]; //从nocow一份代码中学来的,0表示左儿子,1表示右儿子,旋转只需一个函数即可

  (int num;) //该节点在序列中的原位置,可添加

}

该Treap模板支持操作:

1. 插入值

2. 删除值

3. 找出第p小的节点的编号(找最大只需find(T[rt].size, rt);)

4. 找出值小于等于key的节点个数

(添加其他类似操作均可自己修改)

#include <cstdio>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <utility>
#include <vector>
#include <queue>
#include <map>
#include <set>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))
#define INF 0x3f3f3f3f
#define MAXN 100005

using namespace std;

int cnt=1,rt=0; //节点编号从1开始

struct Tree
{
    int key, size, pri, son[2]; //保证父亲的pri大于儿子的pri
    void set(int x, int y, int z)
    {
        key=x;
        pri=y;
        size=z;
        son[0]=son[1]=0;
    }
}T[MAXN];

void rotate(int p, int &x)
{
    int y=T[x].son[!p];
    T[x].size=T[x].size-T[y].size+T[T[y].son[p]].size;
    T[x].son[!p]=T[y].son[p];
    T[y].size=T[y].size-T[T[y].son[p]].size+T[x].size;
    T[y].son[p]=x;
    x=y;
}

void ins(int key, int &x)
{
    if(x == 0)
        T[x = cnt++].set(key, rand(), 1);
    else
    {
        T[x].size++;
        int p=key < T[x].key;
        ins(key, T[x].son[!p]);
        if(T[x].pri < T[T[x].son[!p]].pri)
            rotate(p, x);
    }
}

void del(int key, int &x) //删除值为key的节点
{
    if(T[x].key == key)
    {
        if(T[x].son[0] && T[x].son[1])
        {
            int p=T[T[x].son[0]].pri > T[T[x].son[1]].pri;
            rotate(p, x);
            del(key, T[x].son[p]);
        }
        else
        {
            if(!T[x].son[0])
                x=T[x].son[1];
            else
                x=T[x].son[0];
        }
    }
    else
    {
        T[x].size--;
        int p=T[x].key > key;
        del(key, T[x].son[!p]);
    }
}

int find(int p, int &x) //找出第p小的节点的编号
{
    if(p == T[T[x].son[0]].size+1)
        return x;
    if(p > T[T[x].son[0]].size+1)
        find(p-T[T[x].son[0]].size-1, T[x].son[1]);
    else
        find(p, T[x].son[0]);
}

int find_NoLarger(int key, int &x) //找出值小于等于key的节点个数
{
    if(x == 0)
        return 0;
    if(T[x].key <= key)
        return T[T[x].son[0]].size+1+find_NoLarger(key, T[x].son[1]);
    else
        return find_NoLarger(key, T[x].son[0]);
}
时间: 2025-01-13 18:30:05

treap完全版模板的相关文章

「Splay」指针版与数组版模板

splay总是多打打就熟了,先把板子贴在这里方便查看 Splay的思想还是很简单的,反正就是把每次查询到的都splay到根,维护动态平衡 插入的时候就找到位置,splay到根 删除是最麻烦的,先查找到它并splay到根.然后找到前驱splay到根的左子节点作为根,废掉原先的根节点,然后把右子节点接到前驱的右子树上. 排名只要splay到根输出左子树+1就好了 kth也不难,从根开始,如果不够就往左走,要么是自己,再不行就往右边走.不要忘了k要减掉左子树和cnt 前驱后继只要先插入查一下再删掉就好

手机模板_苹果风格 iOS7 X3_X3.1版源码

[模板介绍:三十大功能与特性]:0.[具有蓝.橙.绿.宝石绿.青.酷黑.红.玫瑰红.粉红.紫.商务蓝.灰蓝12种配色],支持无限配色扩展! 支持iOS.Android系统,兼容多种移动终端!1.[支持图片墙瀑布][发帖.回帖等上传多张图片].2.[App化处理]让您的网站更像一个独立的App应用!3.[全局侧边栏滑出面板菜单]酷炫时尚,动感十足!4.支持全局页脚.头部固定导航:5.支持帖子列表样式和图文样式浏览:[注意:1.(iOS6版只具有质感蓝.酷炫黑两种配色):2.(iOS6版不支持图片墙

【基本算置顶】各大算法&amp;&amp;数据结构模板

板子,全是板子 更新日志(从2018.11.19开始) 2018.12.02 : 更新了数据结构->扫描线 2018.11.22 : 更新了数据结构->平衡树->FHQ Treap->维护区间操作 2018.11.20 : 更新了数论->博弈论->nim游戏 2018.11.20 : 更新了数据结构->平衡树->FHQ Treap 观摩本蒟蒻板子库的大佬数: 不断更新 一.数论 1.快速幂 2.欧拉函数 3.乘法逆元(线性求逆) 4.线性筛素数 5.扩展欧几

dedecms织梦移动版伪静态 - 实现与PC电脑版静态地址url一致教程+伪静态规则

电脑版静态效果 移动版伪静态效果 以下教程所修改的文件(utf8/gbk)打包下载: 修改或者覆盖文件之前请备份以下4个文件\m\index.php\m\list.php\m\view.php\include\arc.listview.class.php 链接: https://pan.baidu.com/s/1i49ABe1 密码: 2wid 电脑版静态生成这里就不多说了,移动版伪静态操作教程如下: 1.移动版域名 m.123.com 解析并指向绑定目录到网站目录的m文件夹 2.后台-系统配置

写一个迷你模板引擎

一直想写一个模板引擎用在自己的代码上,因为之前用的一个开源的产品,每次需要变通的时候都会遇到一些局限性,不如自己写的实在,想改哪就改哪,于是今天花了一点时间造了一个很小的模板引擎,核心功能已经存在,其他的待到以后慢慢的扩充. 模板引擎说白了,就是找到页面上的占位符,然后替换掉,再插入到页面中,不管功能还是实现方法都极其简单. 占位符也就两个地方能够出现的: 文本节点 属性值 通过childNodes能够找到文本节点,通过attributes能够找到该元素下的所有存在属性值,所以请看代码,以下代码

Treap学习基本入门

Treap标准学习模板 1.treap的基本了解 (1)splay与treap的区别 Splay的旋转操作是将普通节点转到根 而treap是将根转为普通节点 (2)treap的时空复杂度 treap的各项操作时间复杂度均摊为O(logn). 由于treap的指针写法容易出错,所以通常用数组代替. 通常要有以下几种: v[]--存放键值 rnd[]--存放随机出的优先级 l[],r[]--左右子树的下标 w[]--相同键值的个数 s[]--以该结点为祖先的节点个数(包括自己) 2.treap基本操

DEDECMS 多模板应用

公司网站用 BOOTstrap3写的模板,无奈在ie6上无法用. 原先有一套ie6的模板,但dedecms 不支持多模板的模式. 解决方法: 思路:仿照DEDECMS移动版,调用ie6版模板来实现.访问地址http://www.xxx.com/ie6/实现 文章页,公司简介,图片页面. 一.文章列表页实现步骤:1,php文件 头添加标示,define('DEDEIE', 'Y');2,arc.listview.class.php 根据标示判断调用相应模板. if ( defined('DEDEI

Emlog手机版教程:获取搜索功能

Emlog手机版好像没有给予获取搜索的相关功能,反正也是无聊状态中,今天舍力就给大家详细的讲解一下此功能的实现方法,希望能够帮到有需要的朋友 首先,我们要在手机版模板的m文件夹的index.php中找到代码 $action = isset($_GET['action']) ? addslashes($_GET['action']) : ''; 在其下方加入代码 $slkey = isset($_GET['keyword']) ? addslashes($_GET['keyword']) : ''

平衡树 fhqTreap 区间操作

//Treap fhq版(不旋转) //此模板为平衡树维护区间操作的模板 //注:在区间操作中split()标准变为子树大小 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<queue> #define INF 0x3f3f3f3f #de