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学习:List接口
List接口 java.util.list接口 extends Collection接口 List接口的特点: 有序的集合,存储元素和取出元素的顺序是一致的(存储123 取出123) 有索引,包含了一 ...
- 树莓派Raspbian系统密码
树莓派Raspbian系统密码 树莓派Raspbian系统默认登录用户名为pi,该账户默认密码是raspberry(可在raspi-config中修改). 树莓派的Raspbian系统root用户默认 ...
- element-ui 上传图片或视频时,先回显在上传
<el-upload class="upload-demo" ref="vidos" :action="URL+'/api/post/file' ...
- Java abstract关键字 抽象类 抽象方法
用 abstract 修饰的类是抽象类,它不能生成对象 含有抽象方法的类称为抽象类 抽象方法使用 abstract 修饰 抽象类不能直接实例化,只能由子类实例化 举例 abstract class T ...
- Android源码分析(四)-----Android源码编译及刷机步骤
一 : 获取源码: 每个公司服务器地址不同,以如下源码地址为例: http://10.1.14.6/android/Qualcomm/msm89xx/branches/msm89xx svn环境执行: ...
- Oracle数据导出导入(PL/SQL工具)
做了那么多年的开发第一次写博客,一开始是没想过要写博客的,后来想写,却一直不敢写,一个是怕自己写的不好,误导人家,二来是不太自信.现在想起写博客是因为,真正的勇士敢于面临淋漓的鲜血,希望能提高自己,也 ...
- prometheus学习系列七: Prometheus promQL查询语言
Prometheus promQL查询语言 Prometheus提供了一种名为PromQL (Prometheus查询语言)的函数式查询语言,允许用户实时选择和聚合时间序列数据.表达式的结果既可以显示 ...
- Python xlrd模块读取Excel表中的数据
1.xlrd库的安装 直接使用pip工具进行安装(当然也可以使用pycharmIDE进行安装,这里就不详述了) pip install xlrd 2.xlrd模块的一些常用命令 ①打开excel文件并 ...
- kuangbin专题专题四 Wormholes POJ - 3259
题目链接:https://vjudge.net/problem/POJ-3259 思路:求有无负环,起点随意选就可以,因为目的只是找出有没有负环,有了负环就可以让时间一直回退,那么一定能回到当初,这里 ...
- httprunner学习17-linux上安装httprunner环境
前言 如果你是在linux上安装httprunner环境,用的是python3的环境,安装成功后会发现hrun命令找不到,需添加软链接. 环境准备: centos 7.6 python 3.6 htt ...