[luogu1168]中位数_优先队列
中位数
题目大意:输出读入的前2*k+1个数的中位数。一共有n个数,按照读入顺序。
注释:$1\le n \le 10^9$。
想法:这是优先队列的一个应用qwq。我们弄两个堆。小根堆和大根堆,保证:大根堆中的任意一个数都小于小根堆,而且大根堆中的元素个数始终比小根堆大且只大1。最后我们只需要输出大根堆的对顶即可。具体地:我们对于每一个新读入的元素和原本合法的大、小根堆进行操作,将当前元素和大根堆对顶进行比较,如果当前元素大于大根堆对顶,我们就将其扔进小根堆,反之,扔进大根堆,显然是正确的。在维护大、小根堆的数目时,我们通过循环处理,无非就是讲大、小根堆的堆顶倒来倒去。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
priority_queue<int>q1;
priority_queue<int,vector<int>,greater<int> >q2;
// int a[100100];
int main()
{
int n;
scanf("%d",&n);
int sum_for_Big=0;//大根堆数目
int sum_for_Small=0;//小根堆数目
for(int i=1;i<=n;i++)
{
int a;
scanf("%d",&a);
if(i==1)
{
sum_for_Big=1;
q1.push(a);
sum_for_Small=0;
printf("%d\n",a);
}
else
{
if(a<q1.top())//插入元素
{
q1.push(a);
sum_for_Big++;
}
else q2.push(a),sum_for_Small++;
if(i%2==1)
{
while(sum_for_Big-sum_for_Small!=1)//维护大、小根堆的数目关系
{
if(sum_for_Big<sum_for_Small)
{
int x=q2.top();
q2.pop();
sum_for_Small--;
q1.push(x);
sum_for_Big++;
}
else
{
int x=q1.top();
q1.pop();
sum_for_Big--;
q2.push(x);
sum_for_Small++;
}
}
printf("%d\n",q1.top());
}
}
}
// printf("%d %d\n",sum_for_Big,sum_for_Small);
// printf("%d\n",q1.top());
// printf("%d\n",q2.top());
return 0;
}/*
3 1 3 5
*/
小结:priority的应用,好像suika学长说heap比这鬼东西快一万倍... ...
[luogu1168]中位数_优先队列的更多相关文章
- 平均数_中位数_众数在SqlServer实现
平均数.中位数.众数都是度量一组数据集中趋势的统计量.所谓集中趋势是指一组数据向某一中心值靠拢的倾向,测度集中趋势就是寻找数据一般水平的代表值或中心值.而这三个特征数又各有特点,能够从不同的角度提供信 ...
- luogu1168 中位数
题目大意 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], -, A[2k - 1]的中位数.即前1,3,5,--个数的中位数. 题解 ...
- P1168 中位数[堆 优先队列]
题目描述 给出一个长度为NNN的非负整数序列AiA_iAi,对于所有1≤k≤(N+1)/21 ≤ k ≤ (N + 1) / 21≤k≤(N+1)/2,输出A1,A3,…,A2k−1A_1, A_3 ...
- 洛谷 P1168 中位数(优先队列)
题目链接 https://www.luogu.org/problemnew/show/P1168 解题思路 这个题就是求中位数,但是暴力会tle,所以我们用一种O(nlogn)的算法来实现. 这里用到 ...
- 剑指 Offer 41. 数据流中的中位数 + 堆 + 优先队列
剑指 Offer 41. 数据流中的中位数 Offer_41 题目详情 题解分析 本题使用大根堆和小根堆来解决这个寻找中位数和插入中位数的问题. 其实本题最直接的方法是先对数组进行排序,然后取中位数. ...
- [C/C++标准库]_[0基础]_[优先队列priority_queue的使用]
std::priority_queue 场景: 1. 对于一个任务队列,任务的优先级由任务的priority属性指明,这时候就须要优先级越高的先运行.而queue并没有排序功能,这时priority_ ...
- Codeforces Round #642 (Div. 3) D. Constructing the Array (优先队列)
题意:有一个长度为\(n\)元素均为\(0\)的序列,进行\(n\)次操作构造出一个新序列\(a\):每次选择最长的连续为\(0\)的区间\([l,r]\),使得第\(i\)次操作时,\(a[\fra ...
- 51nod 第K大区间2(二分+树状数组)
题目链接: 第K大区间2 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 定义一个长度为奇数的区间的值为其所包含的的元素的中位数.中位数_百度百科 现给出n个数,求将所有长度为 ...
- 51nod 1685 第K大区间2
定义一个长度为奇数的区间的值为其所包含的的元素的中位数.中位数_百度百科 现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少. 样例解释: [l,r]表示区间的值[1]:3[2]:1[ ...
随机推荐
- 利用apache自带的工具 分割访问日志
httpd.conf中CustomLog logs/access.log common 改成 CustomLog "|c:/apache/bin/rotatelogs.exe c:/apac ...
- thinphp 整合ueditor
我的ueditor是部署在public/editor 部署前台页面 <script type="text/javascript" > var UEDITOR_HOME_ ...
- The currently displayed page contains invalid values.
1 错误描述 2 错误原因 3 解决办法
- Caused by: java.lang.ClassNotFoundException: com.mchange.v2.ser.Indirector
1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...
- span是没有value标签的,要向获得标签内部的值改怎么办。
1,js实现 var div = document.getElementById('divId');var spans = div.getElementsByTagName('span');var s ...
- val(),text(),html()的区别
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script> ...
- 拥抱.NET Core系列:MemoryCache 缓存域
在上一篇“<拥抱.NET Core系列:MemoryCache 缓存选项>”我们介绍了一些 MSCache 的机制,今天我们来介绍一下 MSCache 中的缓存域. MSCache项目 M ...
- 【CJOJ2512】gcd之和(莫比乌斯反演)
[CJOJ2512]gcd之和(莫比乌斯反演) 题面 给定\(n,m(n,m<=10^7)\) 求 \[\sum_{i=1}^n\sum_{j=1}^mgcd(i,j)\] 题解 首先把公因数直 ...
- mysql的conv的用法
这次的ctf比赛用到这个函数,这里记录一下 题目禁了ascii , ord 那就使用conv 这个函数是用来将字符转换进制的,例如将a转成ASCII码(换个说法就是将16进制的a换成10进制) 那就直 ...
- Spring9:Autowire(自动装配)机制
为什么Spring要支持Autowire(自动装配) 先写几个类,首先定义一个Animal接口表示动物: public interface Animal { public void eat(); } ...