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就是个 ... 
随机推荐
- PHP中一些常用的安全类函数
			(1) htmlspecialchars() 表单验证(验证表单中的数据是否为空以及提交的数据是否合法) htmlspecialchars() //该函数将预定义的字符转化为html实体,预定义的 ... 
- PHP配置  4. 虚拟主机配置open_basedir
			将/usr/local/php/etc/php.ini中open_basedir注释掉,编辑虚拟主机配置open_basedir #vim /usr/local/apache2 .4/conf/ext ... 
- java基础详解-集合
			一.集合组成 java集合主要由Map和Collection组成,Collection主要类图如下(图片来源于网络,懒得画图): 从上图中能很明显的看出来Collection下主要是Set.List和 ... 
- Azure Cost alerts 费用成本分析
			一,引言 依稀记得在一月初,我们在 Azure 上做成了一个 费用警报的监控,果不其然,前两天 Azure 给我发了两封封 Azure 预警警报的邮件,提醒我的预算的总费用超过了设置的通知阈值 &qu ... 
- gtk---实现一个登录界面
			输入框 如果在GTK+中需要输入一个字符串,可以使用输入框,这是一个单行的输入构件,可以用于输入和显示正文内容. 输入框的基本操作函数 1.gtk_entry_new(void); 这是新建一个输入框 ... 
- 回顾反射机制Method
			package com.demo.service; public interface SayHello { void sayHello(String name); } 接口实现类 package co ... 
- 《逆向工程核心原理》Windows消息钩取
			DLL注入--使用SetWindowsHookEx函数实现消息钩取 MSDN: SetWindowsHookEx Function The SetWindowsHookEx function inst ... 
- [源码解析] 并行分布式任务队列 Celery 之 Task是什么
			[源码解析] 并行分布式任务队列 Celery 之 Task是什么 目录 [源码解析] 并行分布式任务队列 Celery 之 Task是什么 0x00 摘要 0x01 思考出发点 0x02 示例代码 ... 
- ON DUPLICATE KEY UPDATE作用
			ON DUPLICATE KEY UPDATE作用 先声明一点,ON DUPLICATE KEY UPDATE为Mysql特有语法,这是个坑 语句的作用,当insert已经存在的记录时,执行Updat ... 
- SpringBoot项目war包部署
			服务部署 记录原因 将本地SpringBoot项目通过war包部署到虚拟机中,验证服务器部署. 使用war包是为了方便替换配置文件等. 工具 对象 版本 Spring Boot 2.4.0 VMwar ... 
