luogu_1168: 中位数
洛谷1168:中位数(对顶堆)
题目描述:
- 给定一个长度为\(N\)的非负整数序列\(A_i\),对于所有\((1\leq k\leq\frac{N+1}{2})\),输出\(A_1,A_3,...,A_{2k-1}\)的中位数。即前\(1,3,4,...\)个数的中位数。
输入格式:
- 第一行为一个整数\(N\),表示序列长度
- 第二行输入\(N\)个非负整数\(A_i\)\((A_i\leq10^9)\)。
输出格式:
- 共\(\frac{N+2}{2}\)行,其中第\(i\)行为\(A_1,A_2,A_3,...,A_{2k-1}\)的中位数。
思路:
- 对顶堆:处理动态中位数等问题,灵活地运用了堆的性质,本质上是维护两个堆。- 大根堆\(Q_1\):维护集合中较小值的部分。
- 小根堆\(Q_2\):维护集合中较大值的部分。
- 可以知道其中大根堆的所有元素都小于小根堆。
 
- 插入操作:- 当需要插入的数字\(x\)大于大根堆堆顶时,插入小根堆。
- 否则插入大根堆。
 
- 维护操作:- 当两个堆的大小之差的绝对值大于\(1\)时。
- 如果大根堆的\(size\)大于小根堆的\(size\),则将大根堆的堆顶插入小根堆并让大根堆执行\(pop\)操作。
- 否则小根堆的堆顶插入大根堆并让小根堆执行\(pop\)操作。
 
- 输出结果:- 当我遍历到的数字是奇数时,输出\(size\)较大的堆的堆顶。
 
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int x, n;
priority_queue<int> q1; //大根堆
priority_queue<int, vector<int>, greater<int> > q2; //小根堆
int main()
{
    scanf("%d%d", &n, &x);
    q1.push(x); //初始值插入大根堆中
    printf("%d\n", x);
    for(int i = 2; i <= n; i++)
    {
        scanf("%d", &x);
        //插入操作
        if(x > q1.top()) q2.push(x);
        else q1.push(x);
        //维护操作
        while(abs((int)q1.size() - (int)q2.size()) > 1)
        {
            if(q1.size() > q2.size())
            {
                q2.push(q1.top());
                q1.pop();
            }
            else
            {
                q1.push(q2.top());
                q2.pop();
            }
        }
        //输出结果
        if(i&1) printf("%d\n", q1.size() > q2.size() ? q1.top() : q2.top());
    }
    return 0;
}
luogu_1168: 中位数的更多相关文章
- [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 ... 
- BZOJ1303 [CQOI2009]中位数图
		本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ... 
- 在MySQL中,如何计算一组数据的中位数?
		要得到一组数据的中位数(例如某个地区或某家公司的收入中位数),我们首先要将这一任务细分为3个小任务: 将数据排序,并给每一行数据给出其在所有数据中的排名. 找出中位数的排名数字. 找出中间排名对应的值 ... 
- AC日记——中位数 洛谷 P1168
		题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[2], …, A[2k - 1]的中位数.[color=red]即[/color] ... 
- [2016湖南长沙培训Day4][前鬼后鬼的守护 chen] (动态开点线段树+中位数 or 动规 or 贪心+堆优化)
		题目大意 给定一个长度为n的正整数序列,令修改一个数的代价为修改前后两个数的绝对值之差,求用最小代价将序列转换为不减序列. 其中,n满足小于500000,序列中的正整数小于10^9 题解(引自mzx神 ... 
- LeetCode 4 Median of Two Sorted Arrays 查找中位数,排除法,问题拓展 难度:1
		思路:设现在可用区间在nums1是[s1,t1),nums2:[s2,t2) 1.当一个数组可用区间为0的时候,由于另一个数组是已经排过序的,所以直接可得 当要取的是最小值或最大值时,也直接可得 2. ... 
- BZOJ 1303 CQOI2009 中位数图 水题
		1303: [CQOI2009]中位数图 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2340 Solved: 1464[Submit][Statu ... 
- 【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays
		一道非常经典的题目,Median of Two Sorted Arrays.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/ ... 
随机推荐
- java异常的基本概念和处理流程
			一.异常的基本概念 在java中把导致程序中断运行的情况分为两种,一种就是异常,而另外一种叫做错误.所有异常的基类是Exception,错误的基类是Error.Exception是在java程序中可以 ... 
- VSCode  命令
			淘宝 NPM 镜像 https://npm.taobao.org/ Ctrl+~ 显示终端 npm start 启动项目 cnpm install 安装模块 
- C# 接口、抽象类、以及事件
			接口.抽象类,用于项目集成,如: Interface icls = appid == "A" ? new ClassA() : new ClassA();icls.func(&qu ... 
- nlp学习杂记
			什么是 token embedding? 输入一个word,在字典里查找得到它对应的下标就是token,然后用该数字下标去lookup表查找得到该词对应的词向量(词嵌入)就是embedding wor ... 
- Julie D. Saba:儿童肿瘤学是一个令人惊奇的领域
			编者按 作为一名儿童肿瘤学家,工作中充满了挑战与机遇.近几十年来,世界各地的儿童肿瘤的发病率呈持续上升的趋势.许多人认为这不仅是由于诊断水平的提高,而且是因为儿童肿瘤的潜在风险也确实在增加.据英国儿童 ... 
- HTML 初始
			HTML(Hyper Text Markup Language的缩写)中文译为“超文本标记语言”,主要是通过HTML标签对网页中的文本.图片.声音等内容进行描述. 一.HTML 骨架结构 每种语言都有 ... 
- 使用Beef劫持客户端浏览器并进一步使用Beef+msf拿客户端shell
			环境: 1.Kali(使用beef生成恶意代码,IP:192.168.114.140) 2.一台web服务器(留言板存在XSS跨站脚本漏洞,IP:192.168.114.204) 3. 客户端(用于访 ... 
- markdown 格式测试
			Q1: before 与 afer 的而区别在哪? Q2: 如何预防"爆仓"? Q3: 在购买量 much > 库存量 num时, 把much自动改为num? -- 在t2的 ... 
- 【GitHub】源代码管理工具初识
			软件工程综合实践第四次个人作业 作业要求:通过搜索资料和自学,了解源代码管理工具——GitHub 前言: GitHub,读音 /git·hʌb/ ,让社会化编程成为现实,其于2018年6月4日被微软收 ... 
- jQuery遍历之find()
			/**案例说明: *首先理清楚find()函数同children()函数之间的区别 * 1. find()会遍历给定节点下的所有的元素节点. * 2. children()之后遍历给定节点下的单一层级 ... 
