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. fhq treap最终模板

    新学习了fhq treap,厉害了 先贴个神犇的版, from memphis /* Treap[Merge,Split] by Memphis */ #include<cstdio> # ...

  2. BZOJ 1691: [Usaco2007 Dec]挑剔的美食家 [treap 贪心]

    1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 786  Solved: 391[Submit][S ...

  3. BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 [treap hash]

    1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1318  Solved: 498[Submit][ ...

  4. 非旋treap模板

    bzoj3580 非旋转treap 在大神教导下发现split一段区间时先split右边再split左边比较好写 #include <cstdio> #include <cstdli ...

  5. POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]

    The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8807   Accepted ...

  6. [普通平衡树treap]【学习笔记】

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9046  Solved: 3840[Submit][Sta ...

  7. UVALive5031 Graph and Queries(Treap)

    反向操作,先求出最终状态,再反向操作. 然后就是Treap 的合并,求第K大值. #include<cstdio> #include<iostream> #include< ...

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

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

  9. hdu 4585 Shaolin treap

    Shaolin Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Problem ...

随机推荐

  1. Android——String.IndexOf 方法 (value, [startIndex], [count])

    报告指定字符在此实例中的第一个匹配项的索引.搜索从指定字符位置开始,并检查指定数量的字符位置.  参数 value  要查找的 Unicode 字符. 对 value 的搜索区分大小写. startI ...

  2. thymeleaf+bootstrap,onclick传参实现模态框中遇到的错误

    一个困扰了N久的问题... 网上大多帖子是这么写的 onclick调javascript函数时,不能直接使用onclick=“editUser(${prod.id})”,这样会报错,需要修改成如下的格 ...

  3. unicode编码转汉字

    String hexB = Integer.toHexString(utfBytes[byteIndex]);   //转换为16进制整型字符串 if (hexB.length() <= 2)  ...

  4. [转载]如何解决failed to push some refs to git

    Administrator@PC-20150110FGWU /K/cocos2d/yc (master) $ git push -u origin master To git@github.com:y ...

  5. ubuntu下android环境的搭建

    ---------省略1000字 https://dl-ssl.google.com/android/eclipse/  如果该方法被墙,直接下载最新ADT,在我的博客里有介绍,或者我已经上传百度网盘 ...

  6. websocke前世今生

    注:以下内容来自网上.本人经过加工整理. 1.问什么要用websocke? Browser已经支持http协议,为什么还要开发一种新的WebSocket协议呢?我们知道http协议是一种单向的网络协议 ...

  7. 【Android实战】Android中处理崩溃异常

    public class MainActivity extends ActionBarActivity { public CrashApplication application; @Override ...

  8. 文本处理三剑客之AWK的用法

    1.awk命令简介: awk是一种可以处理数据.产生格式化报表的语言,功能十分强大. awk的工作方式是读取数据,将每一行数据视为一条记录(record)每笔记录以字段分隔符分成若干字段,然后输出各个 ...

  9. asp.net mvc webconfig配置文件操作

    读取web.config数据,可以不用编译.如发布后,非常有用web.config文件<configuration> <appSettings> <add key=&qu ...

  10. PHP中替换换行符方法总结

    <?php header("content-type:text/html;charset=utf-8"); $str = "aaaa bbbb cccc dddd& ...