Dynamic Median
题意:
设计一个数据结构,初始为空,支持以下操作:
(1)增加一个元素,要求在log(n)时间内完成,其中n是该数据结构中当前元素的个数。注意:数据结构中允许有重复的元素。
(2)返回当前元素集合的中位数,要求在常数时间内完成。如果当前元素的个数为偶数,那么返回下中位数(即两个中位数中较小的一个)。
(3)删除中位数,要求在log(n)时间内完成。
输入输入的第一行是一个自然数T,代表测试数据的组数((1 ≤ T ≤ 600))。每组测试数据的第一行是个自然数N,代表操作的次数,1<=N<=10000。后面的N行中的每行代表一个操作,每次操作首先输入一个单字符代表操作的类型:
I表示插入,后面跟着输入一个正整数(这是唯一带有输入数值的操作)。
Q表示查询,输出当前的中位数(这是唯一产生输出的操作)。
D表示删除当前的中位数。
输入保证是正确的:查询时集合保证不为空(即中位数是存在的),删除时保证集合中有足够可供删除的元素。输出每次查询操作Q时输出的中位数,每次输出单独占一行。
样例输入
1
8
I 4
I 3
I 5
Q
D
I 10
I 2
Q
样例输出
4
3
思路:
维护两个堆,一个小顶堆(存放大于中位数的数),一个大顶堆(存放小于或等于中位数的数)。保持大顶堆的元素个数和小顶堆的元素个数相等(元素总数为偶数)或者大顶堆元素个数比小顶堆的元素个数多一个(元素总数为奇数)。此时,下中位数即为大顶堆堆顶元素。
实现:
#include <cstdio>
#include <iostream>
#include <functional>
#include <queue>
using namespace std; int main()
{
ios::sync_with_stdio(false);
int T, n, d;
char c;
cin >> T;
while (T--)
{
priority_queue<int, vector<int>, greater<int>> minq;
priority_queue<int> maxq;
cin >> n;
int cnt = ;
for (int i = ; i < n; i++)
{
cin >> c;
if (c == 'I')
{
cin >> d;
if (cnt == )
{
maxq.push(d);
}
else if (d > maxq.top())
{
if (cnt & )
{
minq.push(d);
}
else
{
minq.push(d);
maxq.push(minq.top());
minq.pop();
}
}
else
{
if (cnt & )
{
maxq.push(d);
minq.push(maxq.top());
maxq.pop();
}
else
{
maxq.push(d);
}
}
cnt++;
}
else if (c == 'Q')
{
cout << maxq.top() << endl;
}
else
{
if (cnt & )
{
maxq.pop();
}
else
{
maxq.pop();
maxq.push(minq.top());
minq.pop();
}
cnt--;
}
}
}
return ;
}
Dynamic Median的更多相关文章
- Power aware dynamic scheduling in multiprocessor system employing voltage islands
Minimizing the overall power conservation in a symmetric multiprocessor system disposed in a system- ...
- var和dynamic的区别
1.var 1.均是声明动态类型的变量. 2.在编译阶段已经确定类型,在初始化的时候必须提供初始化的值. 3.无法作为方法参数类型,也无法作为返回值类型. 2.dynamic 1.均是声明动态类型的变 ...
- 遍历dynamic的方式
一.遍历ExpandoObject /// <summary> /// 遍历ExpandoObject /// </summary> [TestMethod] public v ...
- No.004:Median of Two Sorted Arrays
问题: There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the median of the ...
- C# dynamic 动态创建 json
1. 如何通过C# 的dynamic 创建如下json 对象? { "query": { "match": [{ "name": " ...
- BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7143 Solved: 2968[Su ...
- 当类型为dynamic的视图模型遭遇匿名对象
当年在ASP.NET MVC 1.0时代我提到,在开发时最好将视图的Model定制为强类型的,这样可以充分利用静态检查功能进行排错.不过有人指出,这么做虽然易于静态检查,但是定义强类型的Model类型 ...
- [LeetCode] Find Median from Data Stream 找出数据流的中位数
Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...
- [LeetCode] Median of Two Sorted Arrays 两个有序数组的中位数
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...
随机推荐
- axios基于常见业务场景的二次封装
axios axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中.在前端框架中的应用也是特别广泛,不管是vue还是react,都有很多项目用axios作为网络 ...
- linux内核的三种主要调度策略
linux内核的三种主要调度策略: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIFO实时调度策略,先到先服务 3,SCHED_RR实时调度策略,时间片轮转 实时进程将得到优先调用, ...
- 让 SyntaxHighlighter 3.x 支持 Lua 语法着色
1. [代码]shBrushLua.js /** * SyntaxHighlighter * http://alexgorbatchev.com/SyntaxHighlighter * * Synta ...
- android:oneshot
帧动画的自动执行:oneshot . 如果为true,表示动画只播放一次停止在最后一帧上,如果设置为false表示动画循环播放.
- java中的泛型类和泛型方法
1.泛型是什么? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类. 可以在集合框架(Collection fram ...
- CodeForces242D:Connected Components (不错的并查集)
We already know of the large corporation where Polycarpus works as a system administrator. The compu ...
- Java内存溢出?
内存溢出? https://www.cnblogs.com/crossoverJie/p/9552119.html 前言 OutOfMemoryError 问题相信很多朋友都遇到过,相对于常见的业务异 ...
- AtCoder Beginner Contest 057
A题 分析:24进制转换 #include<iostream> using namespace std; int main() { int a,b; while(cin>>a& ...
- NIO知识摘录
在 JDK 1. 4 中 新 加入 了 NIO( New Input/ Output) 类, 引入了一种基于通道和缓冲区的 I/O 方式,它可以使用 Native 函数库直接分配堆外内存,然后通过一个 ...
- CodeBlocks+Qt(MinGW)配置
1.安装CodeBlocks 官网:http://www.codeblocks.org/ 下载地址:http://www.codeblocks.org/downloads/26 有以下两种选择 cod ...