题目:http://poj.org/problem?id=3784

将较小的数放入大根堆,较大的数放入小根堆,控制较小数堆大小比较大数堆小1,则较大数堆堆顶即为中位数。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int p,bh,m,a[10005],hp1[10005],hp2[10005],ct1,ct2;
void pus1(int x)
{
ct1++;
hp1[ct1]=x;
int now=ct1;
while(now>1)
{
int tp=now/2;
if(hp1[now]>hp1[tp])
swap(hp1[now],hp1[tp]),now=tp;
else break;
}
}
void pus2(int x)
{
ct2++;
hp2[ct2]=x;
int now=ct2;
while(now>1)
{
int tp=now/2;
if(hp2[now]<hp2[tp])
swap(hp2[now],hp2[tp]),now=tp;
else break;
}
}
int del1()
{
int res=hp1[1];
swap(hp1[1],hp1[ct1]);
ct1--;
int now=1;
while(now*2<=ct1)
{
int tp=now*2;
if(tp<ct1&&hp1[tp]<hp1[tp+1])tp++;
if(hp1[now]<hp1[tp])
swap(hp1[now],hp1[tp]),now=tp;
else break;
}
return res;
}
int del2()
{
int res=hp2[1];
swap(hp2[1],hp2[ct2]);
ct2--;
int now=1;
while(now*2<=ct2)
{
int tp=now*2;
if(tp<ct2&&hp2[tp]>hp2[tp+1])tp++;
if(hp2[now]>hp2[tp])
swap(hp2[now],hp2[tp]),now=tp;
else break;
}
return res;
}
void mv1()
{
int k=del1();
pus2(k);
}
void mv2()
{
int k=del2();
pus1(k);
}
int main()
{
scanf("%d",&p);
while(p--)
{
scanf("%d%d",&bh,&m);
ct1=0;ct2=0;
memset(hp1,0,sizeof hp1);
memset(hp2,0,sizeof hp2);
int js=0;
for(int i=1;i<=m;i++)
scanf("%d",&a[i]);
for(int i=1;i<=m;i++)
{
if(a[i]<hp1[1])
pus1(a[i]);
else pus2(a[i]);
if(i%2)
{
while(ct1>ct2-1)mv1();
while(ct1<ct2-1)mv2();
js++;
if(js==1)printf("%d %d\n",bh,(m+1)/2);
printf("%d ",hp2[1]);
if(js%10==0)printf("\n");
}
}
if(js%10)printf("\n");
}
return 0;
}

  

poj3784Running Median——堆维护中间值的更多相关文章

  1. [UOJ#268]. 【清华集训2016】数据交互[动态dp+可删堆维护最长链]

    题意 给出 \(n\) 个点的树,每个时刻可能出现一条路径 \(A_i\) 或者之前出现的某条路径 \(A_i\) 消失,每条路径有一个权值,求出在每个时刻过后能够找到的权值最大的路径(指所有和该路径 ...

  2. 【bzoj5210】最大连通子块和 树链剖分+线段树+可删除堆维护树形动态dp

    题目描述 给出一棵n个点.以1为根的有根树,点有点权.要求支持如下两种操作: M x y:将点x的点权改为y: Q x:求以x为根的子树的最大连通子块和. 其中,一棵子树的最大连通子块和指的是:该子树 ...

  3. POJ 2010 Moo University - Financial Aid(堆维护滑窗kth,二分)

    按照score排序,贪心,从左到右用堆维护并且记录前面的最小N/2个花费之和. 然后从右向左枚举中位数,维护N/2个数之和加上并判断是否满足条件.(stl的队列没有clear(),只能一个一个pop. ...

  4. C# 堆VS栈 值类型VS引用类型

    最近博客园上连续出现了几篇关于堆VS栈 值类型VS引用类型的文章. 一个是关于C# 堆VS栈的,深入浅出,动图清晰明了,链接如下 C#堆栈对比(Part One) C#堆栈对比(Part Two) C ...

  5. bzoj4165 矩阵 堆维护多路归并

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4165 题解 大概多路归并是最很重要的知识点了吧,近几年考察也挺多的(虽然都是作为签到题的). ...

  6. 洛谷 P3644 [APIO2015]八邻旁之桥(对顶堆维护中位数)

    题面传送门 题意: 一条河将大地分为 \(A,B\) 两个部分.两部分均可视为一根数轴. 有 \(n\) 名工人,第 \(i\) 名的家在 \(x_i\) 区域的 \(a_i\) 位置,公司在 \(y ...

  7. MemSQL Start[c]UP 2.0 - Round 1 F - Permutation 思维+线段树维护hash值

    F - Permutation 思路:对于当前的值x, 只需要知道x + k, x - k这两个值是否出现在其左右两侧,又因为每个值只有一个, 所以可以转换成,x+k, x-k在到x所在位置的时候是否 ...

  8. hdu 4742 Pinball Game 3D(三维LIS&amp;cdq分治&amp;BIT维护最值)

    Pinball Game 3D Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. bzoj 3784: 树上的路径 堆维护第k大

    3784: 树上的路径 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 88  Solved: 27[Submit][Status][Discuss] ...

随机推荐

  1. 设置jvm运行内存

    :1.右击项目—Bulid Path—Configure Build Path—Libraries,找到JRE System Libraary[Sun JDK 1.6.0_13],选中JRE Syst ...

  2. 如何将linux服务器作为文件服务器

    在开发过程中想要使用linux服务器作为文件服务器,可以通过 IP+文件名来获取文件信息,比如http://localhost/banner/a.jpg.设置过程如下 1.安装apache2 sudo ...

  3. 膨胀和腐蚀 - cvErode() 和 cvDilate() 函数实现

    前言 膨胀就是对图中的每个像素取其核范围内最大的那个值,腐蚀就相反.这两个操作常用来突出显示图的某个高亮部分或者昏暗部分以及去噪.本文展示两个分别对图像进行膨胀和腐蚀的例子. 膨胀和腐蚀函数 cvEr ...

  4. HDU1864 最大报销额 01背包

    非常裸的01背包,水题.注意控制精度 #include <iostream> #include <algorithm> #include <cstdio> #inc ...

  5. 机器学习中的EM算法具体解释及R语言实例(1)

    最大期望算法(EM) K均值算法很easy(可參见之前公布的博文),相信读者都能够轻松地理解它. 但以下将要介绍的EM算法就要困难很多了.它与极大似然预计密切相关. 1 算法原理 最好还是从一个样例開 ...

  6. OOP版电子词典

    输入代码: /* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名:sum123.cpp * 作 者:林海云 * 完毕日期:20 ...

  7. node.js的http模块的基础 学到的东西

    node.js的http模块的基础 学到的东西 其中客户端:我们在node.js中如果要请求服务端中的js或者其他脚本的话要使用http.request()方法他会返回http.ClientReque ...

  8. 【BZOJ1150】[CTSC2007]数据备份Backup 双向链表+堆(模拟费用流)

    [BZOJ1150][CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此 ...

  9. EasyPlayer windows RTSP播放器OCX插件使用说明

    鉴于大家对于EasyPlayer插件的使用还不太熟悉,特此写一篇插件的使用文档,供大家参考:EasyPlayer插件有两种,一种是基于IE的ActiveX控件,一种是基于FireFox(也支持多浏览器 ...

  10. 【windows】更改最大动态端口数

    最近业务遇到一个奇怪的问题,一台iis服务器,居然报端口不足的错误,分析应该是服务器可用的动态端口数不够了,windows默认的动态端口范围为:1024-5000,也就是最多3977个动态端口可用,如 ...