洛谷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: 中位数的更多相关文章

  1. [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 ...

  2. [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 ...

  3. BZOJ1303 [CQOI2009]中位数图

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  4. 在MySQL中,如何计算一组数据的中位数?

    要得到一组数据的中位数(例如某个地区或某家公司的收入中位数),我们首先要将这一任务细分为3个小任务: 将数据排序,并给每一行数据给出其在所有数据中的排名. 找出中位数的排名数字. 找出中间排名对应的值 ...

  5. AC日记——中位数 洛谷 P1168

    题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[2], …, A[2k - 1]的中位数.[color=red]即[/color] ...

  6. [2016湖南长沙培训Day4][前鬼后鬼的守护 chen] (动态开点线段树+中位数 or 动规 or 贪心+堆优化)

    题目大意 给定一个长度为n的正整数序列,令修改一个数的代价为修改前后两个数的绝对值之差,求用最小代价将序列转换为不减序列. 其中,n满足小于500000,序列中的正整数小于10^9 题解(引自mzx神 ...

  7. LeetCode 4 Median of Two Sorted Arrays 查找中位数,排除法,问题拓展 难度:1

    思路:设现在可用区间在nums1是[s1,t1),nums2:[s2,t2) 1.当一个数组可用区间为0的时候,由于另一个数组是已经排过序的,所以直接可得 当要取的是最小值或最大值时,也直接可得 2. ...

  8. BZOJ 1303 CQOI2009 中位数图 水题

    1303: [CQOI2009]中位数图 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2340  Solved: 1464[Submit][Statu ...

  9. 【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays

    一道非常经典的题目,Median of Two Sorted Arrays.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/ ...

随机推荐

  1. Linux命令注释—HDFS运维

    HDFS运维—命令注释 1 实验背景 HDFS是大数据其他组件的基础,Hive的数据存储在HDFS中,Mapreduce.Spark 等计算数据也存储在HDFS 中,HBase 的 region 也是 ...

  2. Python Web 之 Flask SQLalchemy

    Flask-SQLalchemy 一. 一对多 A表中的一条记录与B表中的多天记录关联 语法实现: 在"多"实体类中增加 外键列名 = db.Column(db.Integer, ...

  3. 用Python程序温度转换实例

    实例:温度转换 (1)分析问题:利用程序进行温度转换,由用户输入温度值,程序给出输出结果:通过语音识别,图像识别等方法自动监听并获得温度信息发布渠道(如收音机.电视机)给出的温度播报源数据,再由程序装 ...

  4. java基础 接口私有方法

    /** * 问题描述: * 我们需要抽取一个共有方法,用来解决两个默认方法之间重复代码的问题 * 但是这个共有方法不应该让实现类使用,应该是私有化的. * * 解决方案: * 从java 9开始,接口 ...

  5. keras学习入门一

    基本概念 1. 张量 tensor 所有的数据类型都可以看成是张量,可以看成是向量,矩阵在推广 张量的阶,有时候也叫维度,或是轴(axis) 0阶张量如 [] ,5 也叫做标量 1阶张量 如 [ 1, ...

  6. Java自学-接口与继承 对象转型

    Java中的对象转型 示例 1 : 明确引用类型与对象类型的概念 首先,明确引用类型与对象类型的概念 在这个例子里,有一个对象 new ADHero(), 同时也有一个引用ad 对象是有类型的, 是A ...

  7. SqlServer共用表达式(CTE)With As 处理递归查询

    共用表表达式(CTE)可以看成是一个临时的结果集,可以再SELECT,INSERT,UPDATE,DELETE,MARGE语句中多次引用. 一好处:使用共用表表达式可以让语句更加清晰简练. 1.可以定 ...

  8. jQuery 前端复选框 全选 反选 下拉菜单联动

    jQuery 页面中复选框全选.反选.下拉联动(级联) <!DOCTYPE html> <html lang="en"> <head> < ...

  9. element-ui 自定义 Upload 上传进度条

    <el-upload class="upload-demo" ref="vidos" :action="URL+'/api/post/file' ...

  10. day 33

    目录 数据库是什么 为什么使用数据库 数据库的分类 关系型(把数据保存在硬盘里) 非关系型(把数据保存在内存里) mysql的架构 初识mysql 操作数据库 增 删 改 查 数据库是什么 数据库即存 ...