• 分裂:如图,按值分裂,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. phpstrom laravel代码自动提示

    1.安装composer包 composer require barryvdh/laravel-ide-helper dev-master 2.目录:\config\app.php 的'provide ...

  2. c语言心形告白代码实现

    c语言心形告白代码实现 1.彩色告白 include<stdio.h> include<math.h> include<windows.h> include< ...

  3. MySQL必知必会--分 组 数 据

    数据分组 目前为止的所有计算都是在表的所有数据或匹配特定的 WHERE 子句的 数据上进行的.提示一下,下面的例子返回供应商 1003 提供的产品数目 但如果要返回每个供应商提供的产品数目怎么办?或者 ...

  4. 第10章 DOM

    第10章 DOM 10.1 节点层次 10.1.1 Node 类型 10.1.2 Document 类型 10.1.3 Element 类型 10.1.4 Text 类型 10.1.5 Comment ...

  5. Java面向对象入门(2)-访问修饰符

    Java访问修饰符–public, protected, private and default Java提供了四个访问修饰符来设置类,变量,方法和构造函数的访问级别,即public,private, ...

  6. VUE中集成echarts时 getAttribute of null错误

    错误 错误场景一: 错误提示: 在运行Vue项目时出现了上述错误,出现该错误的原因是Echarts的图形容器还未生成就对其进行了初始化所造成的,代码如下: // 基于准备好的dom,初始化echart ...

  7. 使用vscode阅读C代码outline不显示问题

    1 问题:使用vscode code 阅读C代码 outline 显示No symbols found in document 'xxxx' 2 参考网上解决方法,进行如下操作 2.1  安装C/C+ ...

  8. php操作mysql(数据库常规操作)

    php操作数据库八步走 <?php .建立连接 $connection '); .判断连接是否成功 if (mysqli_connect_error() != null) { die(mysql ...

  9. luogu P3369 【模板】普通平衡树

    ————————————————版权声明:本文为CSDN博主「ModestCoder_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https:// ...

  10. C语言 putchar

    C语言 putchar putchar主要功能是输出一个char.可以根据ASLL号码输出对应字符 案例 #define _CRT_SECURE_NO_WARNINGS #include <st ...