hdu5249KPI动态中位数(两个set)
题意(中问题直接粘题意吧)
KPI
Problem Description
你工作以后, KPI 就是你的全部了. 我开发了一个服务,取得了很大的知名度。数十亿的请求被推到一个大管道后同时服务从管头拉取请求。让我们来定义每个请求都有一个重要值。我的KPI是由当前管道内请求的重要值的中间值来计算。现在给你服务记录,有时我想知道当前管道内请求的重要值得中间值。
Input
有大约100组数据。
每组数据第一行有一个n(1≤n≤10000),代表服务记录数。
接下来有n行,每一行有3种形式
"in x": 代表重要值为x(0≤x≤109)的请求被推进管道。
"out": 代表服务拉取了管道头部的请求。
"query: 代表我想知道当前管道内请求重要值的中间值. 那就是说,如果当前管道内有m条请求, 我想知道,升序排序后第floor(m/2)+1th 条请求的重要值.
为了让题目简单,所有的x都不同,并且如果管道内没有值,就不会有"out"和"query"操作。
Output
对于每组数据,先输出一行
Case #i:
然后每一次"query",输出当前管道内重要值的中间值。
Sample Input
6
in 874
query
out
in 24622
in 12194
query
Sample Output
Case #1:
874
24622
思路:
题意要求动态的求中位数,我的方法是开两个优先队列,然后左边升序,右边降序,右边个数-左边个数>=1,然后右边询问的时候直接输出右边最小的,删除的时候就直接mark上(不是马上从队列里面拿出来),然后看看是左边还是右边的,把对应的那边的个数-1,如果发现(右边个数-左边个数>=1)这个条件不满足了,那么就权衡下,两个队列里面的元素处理下(左给右或者右给左),总的时间复杂度与数据无关,是O(n*log(n))的。
#include<stack>
#include<map>
#include<queue>
#include<stdio.h>
#include<string.h>
using namespace std;
typedef struct L
{
int x;
friend bool operator < (L a ,L b)
{
return a.x < b.x;
}
}L;
typedef struct R
{
int x;
friend bool operator < (R a ,R b)
{
return a.x > b.x;
}
}R;
R xinr ,tour;
L xinl ,toul;
priority_queue<L>lq;
priority_queue<R>rq;
queue<int>qq;
map<int ,int>mark;
int main ()
{
int n ,cas = 1 ,i ,a;
char str[10];
while(~scanf("%d" ,&n))
{
while(!lq.empty())lq.pop();
while(!rq.empty())rq.pop();
while(!qq.empty())qq.pop();
mark.clear();
int ls = 0 ,rs = 0;
printf("Case #%d:\n" ,cas ++);
while(n--)
{
scanf("%s" ,str);
if(str[0] == 'i')
{
scanf("%d" ,&a);
mark[a] = 1;
qq.push(a);
if(ls == rs)//往右放
{
rs ++;
if(ls == 0)
{
xinr.x = a;
rq.push(xinr);
}
else
{
toul = lq.top();
xinr.x = a;
if(toul.x < a) rq.push(xinr);
else
{
lq.pop();
tour.x=toul.x;
rq.push(tour);
xinl.x=xinr.x;
lq.push(xinl);
}
}
}
else //往左放
{
ls ++;
tour = rq.top();
xinl.x = a;
if(tour.x > a) lq.push(xinl);
else
{
rq.pop();
toul.x=tour.x;
lq.push(toul);
xinr.x=xinl.x;
rq.push(xinr);
}
}
}
if(str[0] == 'o')
{
int tou = qq.front();
qq.pop();
if(tou >= rq.top().x) rs --;
else ls --;
mark[tou] = 0;
if(ls > rs) //->
{
ls -- ,rs ++;
xinr.x = lq.top().x;
lq.pop();
rq.push(xinr);
}
if(rs - ls == 2)
{
ls ++ ,rs --;
xinl.x = rq.top().x;
rq.pop();
lq.push(xinl);
}
}
if(str[0] == 'q')
{
printf("%d\n" ,rq.top().x);
}
while(!lq.empty())
{
if(!mark[lq.top().x])
lq.pop();
else break;
}
while(!rq.empty())
{
if(!mark[rq.top().x])
rq.pop();
else break;
}
}
}
}
hdu5249KPI动态中位数(两个set)的更多相关文章
- AcWing:106. 动态中位数(对顶堆)
依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数. 输入格式 第一行输入一个整数PP,代表后面数据集的个数,接下来若干行输入各个数据集. 每个数据集的第一行首先 ...
- 【转载】Unity3D研究院之与根据动态的两个轨迹点绘制面详解
大家应该知道3D世界中任何的面都是由三角形绘制完成的,因为任何无规则的集合图形都可以由三角形来组成.比如四边形,无论是正四边形还是无规则四边形都可以由两个三角形拼接而成.结合本文的标题大家仔细想想,如 ...
- Jquery 动态交换两个div位置并添加Css动画效果
前端网页开发中我们经常会遇到需要动态置换两个DIV元素的位置,常见的思路大多是不考虑原始位置,直接采用append或者appendTo方式将两元素进行添加,该法未考虑原始位置,仅会添加为元素的最后一子 ...
- POJ 3784 Running Median (动态中位数)
题目链接:http://poj.org/problem?id=3784 题目大意:依次输入n个数,每当输入奇数个数的时候,求出当前序列的中位数(排好序的中位数). 此题可用各种方法求解. 排序二叉树方 ...
- Java 动态代理 两种实现方法
AOP的拦截功能是由java中的动态代理来实现的.说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执 ...
- HDU 3282 Running Median 动态中位数,可惜数据范围太小
Running Median Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...
- 动态中位数-POJ 3784
题目: 依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数. 输入格式 第一行输入一个整数P,代表后面数据集的个数,接下来若干行输入各个数据集. 每个数据集的第一 ...
- POJ 3784 Running Median【维护动态中位数】
Description For this problem, you will write a program that reads in a sequence of 32-bit signed int ...
- C#动态创建两个按钮,btn2复制btn1的Click事件,匿名委托
现在有一个按钮btn1,要动态创建出一个btn2,需要btn2点击时调用btn1的点击. 在delphi中这种操作很简单:btn2.onClick:=btn1.onClick,因为onClick就是个 ...
随机推荐
- editplus更改编码
1.在Tools下拉后选择Configure User Tools 2.在左边导航菜单找到File,对应右边视图中的Default encoding 3.将编码更改为utf-8,点击底部的OK保存.
- MySQL入门(5)——运算符
MySQL入门(5)--运算符 算术运算符 MySQL支持的算数运算符包括加.减.乘.除.求余. 符号 作用 + 加法运算 - 减法运算 * 乘法运算 / 除法运算 % 求余运算 DIV 除法运算,返 ...
- 基于Docker的MindSpore安装与使用基础介绍
技术背景 MindSpore是一款新一代AI开源计算框架,其特色在于:创新编程范式,AI科学家和工程师更易使用,便于开放式创新:该计算框架可满足终端.边缘计算.云全场景需求,能更好保护数据隐私:可开源 ...
- 自导自演的面试现场之--你竟然不了解MySQL的组提交?
Hi,大家好!我是白日梦!本文是MySQL专题的第 26 篇. 下文还是白日梦以自导自演的方式,围绕"组提交"展开本话题.看看你能抗到第几问吧 换一种写作风格,自导自演面试现场!感 ...
- html Ajax连接.NET Ashx
Html代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <m ...
- c++ 反汇编 if
1.debug if: 10: if (argc == 0) 0010711E 83 7D 08 00 cmp dword ptr [argc],0 00107122 75 11 jne If+35h ...
- 攻防世界 reverse 进阶 15-Reversing-x64Elf-100
15.Reversing-x64Elf-100 这题非常简单, 1 signed __int64 __fastcall sub_4006FD(__int64 a1) 2 { 3 signed int ...
- Android Studio 如何更新到新版本
•How 打开 Android Studio 选择任务栏中的 File 点击 Setting: 来到如下界面: 依次点击 Appearance & Behavior -> System ...
- [DFS]特殊的质数肋骨
特殊的质数肋骨 时间限制:1000MS----内存限制:256000KB 题目描述 农民约翰母牛总是产生最好的肋骨. 你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们. 农民约翰确定他卖给买 ...
- sql注入之超详细sqlmap使用攻略
0x00 前言 干过sql注入的小伙伴们一定听说过sqlmap的大名,但是面对一些特殊情况,sqlmap也不一定"好使",这里的"好使"并不是真正不好使的意思, ...