poj_1442 Treap
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的更多相关文章
- fhq treap最终模板
新学习了fhq treap,厉害了 先贴个神犇的版, from memphis /* Treap[Merge,Split] by Memphis */ #include<cstdio> # ...
- BZOJ 1691: [Usaco2007 Dec]挑剔的美食家 [treap 贪心]
1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 786 Solved: 391[Submit][S ...
- BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 [treap hash]
1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1318 Solved: 498[Submit][ ...
- 非旋treap模板
bzoj3580 非旋转treap 在大神教导下发现split一段区间时先split右边再split左边比较好写 #include <cstdio> #include <cstdli ...
- POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]
The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8807 Accepted ...
- [普通平衡树treap]【学习笔记】
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9046 Solved: 3840[Submit][Sta ...
- UVALive5031 Graph and Queries(Treap)
反向操作,先求出最终状态,再反向操作. 然后就是Treap 的合并,求第K大值. #include<cstdio> #include<iostream> #include< ...
- 【Treap】bzoj1588-HNOI2002营业额统计
一.题目 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司 ...
- hdu 4585 Shaolin treap
Shaolin Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Problem ...
随机推荐
- C语言 · 用宏求球的体积
算法提高 7-1用宏求球的体积 时间限制:1.0s 内存限制:256.0MB 问题描述 使用宏实现计算球体体积的功能.用户输入半径,系统输出体积.不能使用函数,pi=3.141592 ...
- [mmc]Linux下MMC/SD/SDIO的识别与操作
转自:http://blog.csdn.net/skdkjzz/article/details/38927943 我们知道host在扫描卡的过程中,其识别的顺序为SDIO SD MMC,并且从它的注 ...
- KafkaStream实现wordcount
KTable应用 KTable wordCounts = textLines // Split each text line, by whitespace, into words. .flatMapV ...
- C++实现 找出10000以内的完数
C++实现 找出10000以内的完数 #include <stdio.h> int main(){ int n; // 用户输入的整数 int i; // 循环标志 printf(&quo ...
- C++实现最少硬币兑换问题
最少硬币兑换问题 #include<iostream> #include<fstream> using namespace std; int n,L; //n种硬币L长的数组 ...
- [爬虫]Python爬虫进阶
请跳转到以下页面查看: 爬虫进阶
- 清除DataGridView显示的数据
一.DataGridView未绑定数据时清空数据 this.dgv_PropDemo.DataSource = null 二.DataGridView绑定数据时清空数据 DataGridView绑定了 ...
- C++异常抛出与捕获及处理
一.异常 迄今为止,我们处理程序中的错误一般都是用if语句测试某个表达式,然后处理错误的特定义代码. C++异常机制使用了三个新的关键字 (SEH(结构化异常处理)) try ──标识可能出现 ...
- 第二百八十四节,MySQL数据库-MySQL触发器
MySQL数据库-MySQL触发器 对某个表进行[增/删/改]操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行[增/删/改]前后的行为. 1.创建触发器基本语法 ...
- cmd命令行编码设置
cmd窗口情况下:windows下cmd默认的编码是GBK 想在windows下查看sqlite的utf-8中文需要先 执行chcp 65001把当前页换为utf-8编码 chcp 命令: chcp ...