博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj_1442 Treap
阅读量:5974 次
发布时间:2019-06-19

本文共 2163 字,大约阅读时间需要 7 分钟。

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

题目大意

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

题目分析

    对于数据的查询,可以考虑使用treap这种平衡二叉树来实现。而且treap这种动态平衡树结构,可以很方便的实现第k大的查询。 

    需要注意的是,每个节点保存与该节点相同元素的个数count对查询第k个数据时候的影响,见代码。

实现(c++)

#define _CRT_SECURE_NO_WARNINGS#include
#include
#define MAX_NUM 30010struct 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;}

 

转载地址:http://qxbox.baihongyu.com/

你可能感兴趣的文章
hive启动问题 Unable to start Hive Cli
查看>>
虚拟化系列-Windows server 2012 网络管理
查看>>
gridview 获取当前行的index ,按钮的click事件
查看>>
Linux常用命令
查看>>
vmstat命令的含义
查看>>
无线自主AP漫游
查看>>
【翻译】在Ext JS应用程序中构建可维护的控制器
查看>>
C#开发学习——SqlHelper的应用
查看>>
第四周作业
查看>>
Chem 3D中怎么创建立体模型
查看>>
5月8号打卡
查看>>
[转]各种排序算法的分析及java实现
查看>>
用扩展开发一个PHP类
查看>>
How Delete File with Readonly Permission?
查看>>
[MSSQL2005]再看CTE
查看>>
Ubuntu安装Fcitx(小企鹅五笔输入法)
查看>>
例:进店买衣服案例
查看>>
#考研笔记#计算机问答题
查看>>
深入学习golang(4)—new与make
查看>>
JS动态生成<style>
查看>>