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 ...
随机推荐
- Unity3D中的序列化测试
Unity3D中序列化字段常使用[SerializeField],序列化类常采用[System.Serializable],非序列化采用[System.NonSerialized]. 序列化类使用时发 ...
- 解决运行github项目build时间长问题
运行github上的项目的时候,有时会build很长时间 可以打开项目所在目录修改这个文件:项目名XXX/gradle/wrapper/gradle-wrapper.properties 这个文件中的 ...
- 【WPF】设置ListBox容器Item的流式布局
需求:像下图那样显示把一组内容装入ListBox中显示.要求用WrapPanel横向布局,顺序如图中的数字. 问题:ListBox默认的布局是从上往下单列的,所以需要设置布局. <ListBox ...
- USB 驱动之 usb_register 函数解析
前段时间在kernel 添加了 USB to LAN 模块 AX88772B 的驱动. 根据相关添加解析一下 usb_register_driver 函数 drivers/net/usb/asix.c ...
- Android——列表视图 ListView(二)SimpleAdapter
SimpleAdapter:可显示文字加图片 activity_activitysimple.xml <?xml version="1.0" encoding="u ...
- oozie调度sqoop脚本时操作符号替换
oozie调度sqoop脚本时,sqoop中使用的sql查询语句,需要使用以下字符串替换操作符,否则会出现各种诡异的错误: //替换字符 < < Less than 小于 > > ...
- ElasticSearch0910学习
1:es简介 es是一个分布式的搜索引擎,使用java开发,底层使用lucene. 特点:天生支持分布式的.为大数据而生的.基于restful接口. 2:es和solr对比 接口 solr:类似web ...
- Storm快速理解
转自:http://blog.csdn.net/colorant/article/details/8256039 更多云计算相关项目快速理解文档 http://blog.csdn.net/color ...
- 关于Cocos2d-x中对其他某个类的某个属性的获得
类A要获得类B中的某个属性,可以是节点属性 方法一 1.先在B类中定义一个_edge的节点属性(可以在B类中进行各种对_edge的操作),然后写一个方法Node* GameController::ge ...
- 使用_snscanf_s转换十六进制时引起的内存越界
//将Hex编码转换为指定编码格式的字符串 string Encoding::DecodeHexString(const string &strSrc, UINT code_page ) { ...