• 分裂:如图,按值分裂,u比k大则切黄色的一,此时u接上Y的左子树,然后可见Y的左子树仍然空着,u也递归到其左子树。同理,u比k大则切红色的一,此时u接上X的右子树,然后可见X的右子树仍然空着,u也递归到其右子树。
  • 合并:随机切红色和紫色,合并的是切口上面部分,return合并后的根,,比如,如果切红色,那递归合并X的右子树和Y,并且X的右儿子的指针指向X的右子树和Y合并的结果。

BZOJ3224: Tyvj 1728 普通平衡树

  • 模板题,代码:

     1 #include <bits/stdc++.h>
    2 #define nmax 100010
    3
    4 using namespace std;
    5 int s[nmax][2]={0};
    6 int si[nmax]={0}, v[nmax], r[nmax];
    7 int cnt = 0;
    8
    9 void up(int p){
    10 si[p] = si[ s[p][0] ] + si[ s[p][1] ] + 1;
    11 }
    12
    13 void spilit(int& x, int& y, int k, int u){
    14 if(!u) { x=y=0; return; }
    15 if(v[u] <= k){
    16 x = u;
    17 spilit(s[x][1], y, k, s[x][1]);
    18 }else{
    19 y = u;
    20 spilit(x, s[y][0], k, s[y][0]);
    21 }
    22 up(u);
    23 }
    24
    25 int merge(int x, int y){
    26 if(!x || !y){ return x|y; }
    27 if(r[x] > r[y]) {
    28 s[x][1] = merge(s[x][1], y);
    29 up(x);
    30 return x;
    31 }else{
    32 s[y][0] = merge(x, s[y][0]);
    33 up(y);
    34 return y;
    35 }
    36 }
    37
    38 int kth(int k, int u){
    39 int ans, t;
    40 while(1){
    41 t = si[ s[u][0] ] + 1;
    42 if(k == t) { ans = u; break; }
    43 else if(k < t) u=s[u][0];
    44 else { u=s[u][1]; k-=t; }
    45 }
    46 return v[ans];
    47 }
    48
    49 int newnode(int k){
    50 cnt++;
    51 v[cnt] = k;
    52 si[cnt] = 1;
    53 r[cnt] = rand();
    54 return cnt;
    55 }
    56
    57 int main(){
    58 int n, op, num;
    59 cin >> n;
    60 int x, y, z, root=0;
    61 while(n--){
    62 scanf("%d%d", &op, &num);
    63 switch (op)
    64 {
    65 case 1:
    66 z = newnode(num);
    67 spilit(x, y, num, root);
    68 root = merge( merge(x,z) , y );
    69 break;
    70 case 2:
    71 spilit(x, y, num, root);
    72 spilit(x, z, num-1, x);
    73 z = merge(s[z][0], s[z][1]);
    74 root = merge( merge(x,z), y );
    75 break;
    76 case 3:
    77 spilit(x, y, num-1, root);
    78 printf("%d\n", si[x]+1);
    79 root = merge(x, y);
    80 break;
    81 case 4:
    82 printf("%d\n", kth(num, root) );
    83 break;
    84 case 5:
    85 spilit(x, y, num-1, root);
    86 printf("%d\n", kth(si[x], x) );
    87 root = merge(x, y);
    88 break;
    89 default:
    90 spilit(x, y, num, root);
    91 printf("%d\n", kth(1, y) );
    92 root = merge(x, y);
    93 break;
    94 }
    95 }
    96 return 0;
    97 }

    ( ఠൠఠ )ノ

FHQTreap刷题记录的更多相关文章

  1. PE刷题记录

    PE刷题记录 PE60 / 20%dif 这道题比较坑爹. 所有可以相连的素数可以构成一张图,建出这张图,在其中找它的大小为5的团.注意上界的估算,大概在1W以内.1W内有1229个素数,处理出这些素 ...

  2. leetcode刷题记录--js

    leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...

  3. Leetcode刷题记录(python3)

    Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...

  4. 刷题记录:[HarekazeCTF2019]encode_and_encode

    目录 刷题记录:[HarekazeCTF2019]encode_and_encode 一.知识点 JSON转义字符绕过 php伪协议 刷题记录:[HarekazeCTF2019]encode_and_ ...

  5. 刷题记录:[De1CTF 2019]Giftbox && Comment

    目录 刷题记录:[De1CTF 2019]Giftbox && Comment 一.知识点 1.sql注入 && totp 2.RCE 3.源码泄露 4.敏感文件读取 ...

  6. 刷题记录:[强网杯 2019]Upload

    目录 刷题记录:[强网杯 2019]Upload 一.知识点 1.源码泄露 2.php反序列化 刷题记录:[强网杯 2019]Upload 题目复现链接:https://buuoj.cn/challe ...

  7. 刷题记录:[XNUCA2019Qualifier]EasyPHP

    目录 刷题记录:[XNUCA2019Qualifier]EasyPHP 解法一 1.error_log结合log_errors自定义错误日志 2.include_path设置包含路径 3.php_va ...

  8. 刷题记录:[DDCTF 2019]homebrew event loop

    目录 刷题记录:[DDCTF 2019]homebrew event loop 知识点 1.逻辑漏洞 2.flask session解密 总结 刷题记录:[DDCTF 2019]homebrew ev ...

  9. 刷题记录:[CISCN2019 东北赛区 Day2 Web3]Point System

    目录 刷题记录:[CISCN2019 东北赛区 Day2 Web3]Point System 知识点 1.padding-oracle attack 2.cbc字节翻转攻击 3.FFMpeg文件读取漏 ...

随机推荐

  1. USBWebServer - 在U盘里搭一个Web服务器!

    文章选自我的博客:https://blog.ljyngup.com/archives/321.html/ 本文将介绍一款可以在U盘内直接搭建Web服务器的软件 软件可以免安装直接在U盘内运行,适合外出 ...

  2. 不用'+'完成a + b

    这也是'+'底层运算原理: #include<bits/stdc++.h> using namespace std; int a,b; int main() { scanf("% ...

  3. Elasticsearch原理学习--为什么Elasticsearch/Lucene检索可以比MySQL快?

    转载于:http://vlambda.com/wz_wvS2uI5VRn.html 同样都可以对数据构建索引并通过索引查询数据,为什么Lucene或基于Lucene的Elasticsearch会比关系 ...

  4. shell 颜色输出

    #!/bin/bash function display_method(){ clearDisplayMetho=0 if [ $displayMethod -eq 0 ]; then echo -e ...

  5. php oci 和 pdo_oci 安装

    安装非常复杂,必须记录 CentOS服务器上已有相关环境:apache.php5 需要安装:1.oracle客户端.2.oci8扩展.3.pdo_oci扩展. 一. 准备文件 1) oracle客户端 ...

  6. 【转载】s19文件格式详解

    来源:http://blog.csdn.net/xxxl/article/details/19494187 1.概述 为了在不同的计算机平台之间传输程序代码和数据,摩托罗拉将程序和数据文件以一种可打印 ...

  7. float布局打破标准流,神助攻clear清浮动

    布局是什么?根据功能划分小块,再根据设计稿还原,书写静态页面,然后再在块里面填充内容,完善功能,js施加交互效果.div作为一个容器,独占一行,代码书写习惯从上至下属于标准流,而浮动float的css ...

  8. AD常用命令以及概念

    活动目录服务器常用命令合集如下: net accounts  查看第一台域控的计算机角色net accounts   查看计算机角色net share      查看共享netdom query fs ...

  9. Lua实现的八皇后问题

    来自<Lua程序与设计>第二节- 八皇后问题 输出所有解的解法 书中提供的源代码,加注了自己的注释. N = 8 --[[ N为棋盘规模 a为一维数组,保存第i个皇后所在的列数 ]] -- ...

  10. 【python基础语法】模块和包管理,文件的操作(第8天课堂笔记)

    ''' 模块和包管理 模块和包的定义: 模块:模块是一个Python文件,以.py结尾,包含了Python对象定义和Python语句 包:Python中的包就是一个包含__init__.py文件的目录 ...