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 ...
随机推荐
- nand ECC 算法记录
nandflash ECC 原理记录. nand ECC 全称是Error Checking and correction. 该算法分为列校验和行校验. 列校验有下图所示: * 如上图所示, CP0 ...
- [uart]UART中的硬件流控RTS与CTS
转自:http://blog.csdn.net/zeroboundary/article/details/8966586 在RS232中本来CTS 与RTS 有明确的意义,但自从贺氏(HAYES ) ...
- java方法——重载2
什么是Java方法重载 方法重载的定义 1 对于同一个类,如果这个类里面有两个或者多个重名的方法,但是方法的参数个数.类型.顺序至少有一个不一样,这时候局构成方法重载. END 方法重载示例 1 pu ...
- Android Studio:Multiple dex files define Landroid/support/annotation/AnimRes
近期真的比較忙,一不小心博客又荒了两个月. 从今天起.决定重返csdn,多多纪录和分享. 先从一个近期被折磨的死去活来的问题. 由于升级了V4包,就一直报这个问题: com.android.dex.D ...
- Elasticsearch 5
Elasticsearch 5常见问题解决方案 安装运行 1.前置安装java8 jdk-8u112-linux-x64.rpm 下载地址:http://www.oracle.com/tech ...
- 配置QQ企业邮箱小结
https://exmail.qq.com/login 1,注册管理员账号 2,添加域名 3.设置MX记录 记录类型选:MX记录 主机记录(RR):不填(非万网可以填写@) 记录值与MX优先级分别为: ...
- sql server merge 的用法
CREATE TABLE tTable ( id INT , f1 VARCHAR(10) , f2 VARCHAR(10) , f3 VARCHAR(10) ) GO INSERT INTO tTa ...
- spark学习系列
转自: http://www.cnblogs.com/magj2006/p/4316264.html spark 系列文章汇总 源码导读 spark 源码导读1 从spark启动脚本开始 spark ...
- e677. 模糊化图像
This example demonstrates a 3x3 kernel that blurs an image. Kernel kernel = new Kernel(3, 3, new flo ...
- e661. 确定图像中是否有透明像素
// This method returns true if the specified image has transparent pixels public static boolean hasA ...