P1168 中位数[堆 优先队列]
题目描述
给出一个长度为NNN的非负整数序列AiA_iAi,对于所有1≤k≤(N+1)/21 ≤ k ≤ (N + 1) / 21≤k≤(N+1)/2,输出A1,A3,…,A2k−1A_1, A_3, …, A_{2k - 1}A1,A3,…,A2k−1的中位数。即前1,3,5,…1,3,5,…1,3,5,…个数的中位数。
输入输出格式
输入格式:
第1行为一个正整数N,表示了序列长度。
第2行包含N个非负整数Ai(Ai≤109)。
输出格式:
共2(N+1)/2行,第iii行为A1,A3,…,A2k−1的中位数。
输入输出样例
7
1 3 5 7 9 11 6
1
3
5
6
说明
对于20%的数据,N≤100;
对于40%的数据,N≤3000;
对于100%的数据,N≤100000。
解析:
解法一:
STL的vector暴力解。
参考代码:
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<queue>
#include<vector>
#include<algorithm>
#define N 100010
using namespace std;
vector<int> a;
int main()
{
int n,x;
cin>>n;
for(int i=;i<n;i++)
{
scanf("%d",&x);
a.insert(upper_bound(a.begin(),a.end(),x),x);
if(i%==) printf("%d\n",a[(i+)/]);
}
return ;
}
解法二:
这里要引入一种堆的新的打开方式:两个堆维护第k大/小的数。
我们用一个大跟堆存放较小值,一个小根堆存放较大值,也就是说,两个堆保持大根堆中的最大值恒比小根堆中的最小值小这样一种性质。
每次动态向两个堆中放入数值时,我们都要维护它的性质,使得它是第k大的值。
求中位数是这个思路的一个变种。
参考代码:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
using namespace std;
priority_queue<int> q;
priority_queue<int,vector<int>,greater<int> > p;
int main()
{
int n,x;
cin>>n;
scanf("%d",&x);
q.push(x);
printf("%d\n",q.top());
for(int i=;i<=n;i++)
{
scanf("%d",&x);
if(x<q.top()) q.push(x);
else p.push(x);
while(abs(q.size()-p.size())>)
{
if(q.size()>p.size()){
p.push(q.top());q.pop();
}
else{
q.push(p.top());p.pop();
}
if(i%){
if(q.size()>p.size()) printf("%d\n",q.top());
else printf("%d\n",p.top());
}
}
}
return ;
}
2019-05-26 17:13:43
P1168 中位数[堆 优先队列]的更多相关文章
- [luogu]P1168 中位数[堆]
[luogu]P1168 中位数 题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], …, A[2k - 1]的中位数.即前1 ...
- P1168 中位数 堆
题目描述 给出一个长度为NN的非负整数序列A_iAi,对于所有1 ≤ k ≤ (N + 1) / 21≤k≤(N+1)/2,输出A_1, A_3, …, A_{2k - 1}A1,A3,…,A2 ...
- 洛谷 P1168 中位数(优先队列)
题目链接 https://www.luogu.org/problemnew/show/P1168 解题思路 这个题就是求中位数,但是暴力会tle,所以我们用一种O(nlogn)的算法来实现. 这里用到 ...
- 剑指 Offer 41. 数据流中的中位数 + 堆 + 优先队列
剑指 Offer 41. 数据流中的中位数 Offer_41 题目详情 题解分析 本题使用大根堆和小根堆来解决这个寻找中位数和插入中位数的问题. 其实本题最直接的方法是先对数组进行排序,然后取中位数. ...
- 洛谷——P1168 中位数
P1168 中位数 题目描述 给出一个长度为NN的非负整数序列$A_i$,对于所有1 ≤ k ≤ (N + 1),输出$A_1, A_3, …, A_{2k - 1}A1,A3,…,A2k−1 ...
- P1168 中位数
P1168 中位数树状数组+二分答案.树状数组就是起一个高效查询比二分出来的数小的有几个. #include<iostream> #include<cstdio> #inclu ...
- 【洛谷】【堆】P1168 中位数
[题目描述:] 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], …, A[2k - 1]的中位数.即前1,3,5,……个数的中位数. ...
- P1168 中位数(对顶堆)
题意:维护一个序列,两种操作 1.插入一个数 2.输出中位数(若长度为偶数,输出中间两个较小的那个) 对顶堆 维护一个小根堆,一个大根堆,大根堆存1--mid,小根堆存mid+1---n 这样堆顶必有 ...
- P1168 中位数 (优先队列,巧解)
题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], …, A[2k - 1]的中位数.即前1,3,5,……个数的中位数. 输入 ...
随机推荐
- 【转】 嵌入式C语言编程中Inline函数的应用
源地址:https://blog.csdn.net/vigour1000/article/details/9622037 有一段儿时间没写写经验笔记了,哎,也是自己这一段时间以来(其实最近一直是这个状 ...
- Dotmemory 内存分析工具的操作手册
教程一.开始学习dotmemory 在本教程中,我们将学习如何运行dotMemory内存快照.此外,我们将简要地看看dotMemory的用户界面和基本分析的概念.考虑dotMemory本教程作为起点 ...
- 重磅!滴滴跨端框架Chameleon 1.0正式发布
滴滴在 GitHub 上开源的跨端解决方案 Chameleon(简写 CML)正式发布 1.0 版本,中文名卡梅龙:中文意思变色龙,意味着就像变色龙一样能适应不同环境的企业级跨端整体解决方案,具有易用 ...
- 微信小程序之一:动态添加view(view包含picker,input)
<view wx:for="{{array}}" wx:key="this" class="borderContainer"> ...
- [bzoj3420]Poi2013 Triumphal arch_树形dp_二分
Triumphal arch 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=3420 数据范围:略. 题解: 首先,发现$ k $具有单调性,我们 ...
- e.g. i.e. etc. et al. w.r.t. i.i.d.英文论文中的缩写语
e.g. i.e. etc. et al. w.r.t. i.i.d. 用法:, e.g., || , i.e., || , etc. || et al., || w.r.t. || i.i.d. e ...
- mysql数据库,数据表,数据的增删查改语句
查询mysql支持的引擎 show engines; 查询mysql支持的字符集 show character set; 设置mysql默认存储引擎 set default_storage_engin ...
- CSS中的position和float
对基础知识再度做个巩固和梳理. 一.position定位 (一):position的属性 1.absolute:生成绝对定位的元素,相对于最近一级定位不是static的父元素来进行定位: 2.rela ...
- 暑期ACM集训
2019-07-17 08:42:11 这是总结昨天的做题情况 总体来说,好久的没做题了,实力下降了许多,这一个月假又学习吧!!!! A - Ropewalkers Polycarp decided ...
- Scala 面向对象编程之对象
此对象非彼java bean对象 是scala object的对象 Object // object,相当于class的单个实例,通常在里面放一些静态的field或者method // 第一次调用ob ...