Treap是一种动态平衡二叉树结构,具有期望的O(log2n)的复杂度。适用于动态区间数据的查询、更改、维护等操作。

题目大意

一组数从前向后插入队列中,插入的过程中会有查询,查询当前队列中的第k小的数。

题目分析

对于数据的查询,可以考虑使用treap这种平衡二叉树来实现。而且treap这种动态平衡树结构,可以很方便的实现第k大的查询。 
    需要注意的是,每个节点保存与该节点相同元素的个数count对查询第k个数据时候的影响,见代码。

实现(c++)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<algorithm>
#define MAX_NUM 30010
struct TreapNode{int key;int priority;int size;int count;TreapNode* child[2];TreapNode(int val){key = val;priority = rand();child[0] = child[1] = NULL;count = size = 1;}void Update(){size = count;if (child[0]){size += child[0]->size;}if (child[1]){size += child[1]->size;}}
};struct Treap{TreapNode* root;Treap() :root(NULL){};void Rotate(TreapNode*& node, int dir){TreapNode* ch = node->child[dir];node->child[dir] = ch->child[!dir];ch->child[!dir] = node;node->Update();node = ch; //reference}void Insert(TreapNode*& node, int k){if (!node){node = new TreapNode(k);}else if (node->key == k){node->count++;}else{int dir = node->key < k;Insert(node->child[dir], k);if (node->priority < node->child[dir]->priority){Rotate(node, dir);}}node->Update();}int GetKth(TreapNode* root, int k){TreapNode* node = root;while (node){if (!node->child[0]){if (k <= node->count){return node->key;}else{k -= (node->count);node = node->child[1];}}else{if (node->child[0]->size < k && node->child[0]->size + node->count >= k){return node->key;}else if (node->child[0]->size >= k){node = node->child[0];}else{k -= (node->child[0]->size + node->count);node = node->child[1];}}}return 0;}
};
int gNumber[MAX_NUM];
Treap gTreap;
int main(){int number_count, query_count;scanf("%d%d", &number_count, &query_count);for (int i = 0; i < number_count; i++){scanf("%d", &gNumber[i]);}int query_old = 0;int query_new;for (int i = 1; i <= query_count; i++){scanf("%d", &query_new);for (int k = query_old; k < query_new; k++){gTreap.Insert(gTreap.root, gNumber[k]);}query_old = query_new;int result = gTreap.GetKth(gTreap.root, i);printf("%d\n", result);}return 0;
}

poj_1442 Treap相关推荐

  1. 【Treap】bzoj1588-HNOI2002营业额统计

    一.题目 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司 ...

  2. 【bzoj2770】YY的Treap 权值线段树

    题目描述 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap.友爱教教父SY如砍瓜切菜般教会了YY小朋友Treap(一种平衡树,通过对每个节点随机分 ...

  3. 2019 ICPC 南昌 K. Tree(树上启发式合并,平衡树 treap)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://nanti.jisuanke.com/t/42586 Problem 给定一 ...

  4. luogu P2596 [ZJOI2006]书架(平衡树、无旋treap(按排名分裂)一些更复杂的操作)

    P2596 [ZJOI2006]书架 无旋treap可以维护一棵树的中序遍历结果.但是不支持通过编号来找节点.于是在无旋treap的基础上,我维护了每个节点的父亲,这样就可以求出一个节点是中序遍历中的 ...

  5. luogu P3391 【模板】文艺平衡树(FHQ - treap,懒惰标记)

    整理的算法模板合集: ACM模板 我们把每个查询区间使用solit分裂成[1l−1][lr][r+1n][1~l-1][l~r][r+1~n][1 l−1][l r][r+1 n]三个区间. 再把[l ...

  6. 模板 - FHQ - treap 无旋平衡树

    整理的算法模板合集: ACM模板 目录 FQH - treap 无旋平衡树 按权值分裂 按排名分裂 文艺平衡树 可持久化序列 FQH - treap 无旋平衡树 operator 1 : 插入一个数 ...

  7. 【数据结构】平衡树 - treap

    treap = tree + heap 树堆(treap:让BST尽量随机) 动态维护一个有序序列 对于一个大根堆: 最大值:一直往右走 最小值:一直往左走 treap实现操作 set实现 ①插入 i ...

  8. BZOJ1112[POI2008]砖块Klo——非旋转treap

    题目描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次数的动作完成任 ...

  9. 三大平衡树(Treap + Splay + SBT)总结+模板

    Treap树 核心是 利用随机数的二叉排序树的各种操作复杂度平均为O(lgn) Treap模板: #include <cstdio> #include <cstring> #i ...

最新文章

  1. 【神经网络】(2) 网络优化,案例:服装图像分类,附python完整代码
  2. zabbix 清空历史表
  3. Uva10285 Longest Run on a Snowboard
  4. 多平台数据库客户端工具DBeaver
  5. python模块引用
  6. Python 标准库 —— uuid(生成唯一 ID)
  7. ios下使用rsa算法与php进行加解密通讯
  8. 《MySQL必知必会》读书笔记_3
  9. 华为Mate 30 Pro全新配色曝光:“赤茶橘”颜值超高
  10. VK Cup 2012 Round 1 D. Distance in Tree (树形dp)
  11. 四次面试:程序员越来越悲催了?
  12. MATLAB 线性运算之图像相加去噪
  13. redis数据类型之String入门
  14. 数据库中间件01-认识mycat
  15. php更新记录没有获取值,php – 节点更新:获取旧值
  16. system2之:4-LVM逻辑卷管理
  17. ffmpeg推流错误
  18. 发送邮件服务器错误怎么更改,怎么解决SMTP服务器发送邮件失败
  19. 精英模具设计师的“葵花宝典”
  20. snipaste如何滚动截图_3款工具满足你对截图软件的所有想象

热门文章

  1. 为什么 scrum 开发人员是一个 T-形的人 ?
  2. webpack4.x中使用postcss-loader、autoprefixer给CSS属性自动添加前缀
  3. 第2章:Maven的安装/2.1 Window下的安装
  4. 智能编撰:使用神经网络协助编写电子邮件
  5. js基础知识学习(二)
  6. iOS JSPatch 热修复使用
  7. 程序、进程与线程的关系
  8. Joining Byte Blocks(哈希+带花树)
  9. MapReduce异常
  10. 黄聪:Wordpress3.2去除url中的category(不用插件实现)