Running Median POJ - 3784 (对顶堆/优先队列 | 链表)
Input
Output
Sample Input
3
1 9
1 2 3 4 5 6 7 8 9
2 9
9 8 7 6 5 4 3 2 1
3 23
23 41 13 22 -3 24 -31 -11 -8 -7
3 5 103 211 -311 -45 -67 -73 -81 -99
-33 24 56
Sample Output
1 5
1 2 3 4 5
2 5
9 8 7 6 5
3 12
23 23 22 22 13 3 5 5 3 -3
-7 -3 题意:每组M个数,然后对于每组数读入的时候,只要读入了奇数个的数,就求出先前读入数的中位数,然后输出 思路:可以采用两个优先队列的做法,如果当前读入的数>当前中位数,插入小根堆,否则插入大根堆,这样实际上就维护了中位数相邻两侧的值。
然后维护 num【小根堆】 - num【大根堆】 <= 1,就是维护中位数两侧的数量应当均分,这样小根堆的top,即是中位数
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std; int t;
int cas,n;
const int maxn = 1e4+;
int ans[maxn];
int main()
{
scanf("%d",&t);
while(t--)
{
priority_queue<int,vector<int>,greater<int> >que1;
priority_queue<int,vector<int>,less<int> >que2; scanf("%d%d",&cas,&n);
printf("%d %d\n",cas,n/+);
int tmp;
int l=,r=,num=;
int cnt = ;
for(int i=;i<=n;i++)
{
scanf("%d",&tmp);
if(tmp > num)
{
que1.push(tmp);
r++;
}
else
{
que2.push(tmp);
l++;
}
if(r < l)
{
int f = que2.top();
que2.pop();
que1.push(f);
r++,l--;
}
else if(r > l + )
{
r--,l++;
int f = que1.top();
que1.pop();
que2.push(f);
}
num = que1.top();
if(i&)
{
ans[++cnt] = num;
}
}
for(int i=;i<=cnt;i++)
{
printf("%d",ans[i]);
if(i != cnt && i%!=)printf(" ");
else printf("\n");
}
}
}
链表:
链表主要是个离线处理,先将所有的数据读入,然后记录下其下标。
然后对其排序,记录下在有序序列下,原来下标的数在哪出现。
然后从n~1进行处理,因为n永远是该序列剩余的数中最后出现的,也就是说不会将该数后未输入的数进行计算。 (关于中位数下标pos的移动那,按照写法是有问题的,但是这题上适用)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; int t;
int cas,n;
const int maxn = 1e4+;
struct Node
{
int val;
int next;
int pre;
int index;
}node[maxn];
int p[maxn]; bool cmp(Node a,Node b)
{
return a.val < b.val;
}
int ans[maxn];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&cas,&n);
printf("%d %d\n",cas,(n+)>>);
for(int i=;i<=n;i++)
{
scanf("%d",&node[i].val);
node[i].index = i;
}
sort(node+,node++n,cmp);
for(int i=;i<=n;i++)
{
node[i].next = i+;
node[i].pre = i-;
}
node[].pre = node[n].next = -;
for(int i=;i<=n;i++)
{
p[node[i].index] = i;
}
int pos = (n+)>>;
int tot = ;
int l=,r=;
for(int i=n;i>;i--)
{ if(i & )
{
if(l > r)pos = node[pos].next;
else if(l < r)pos = node[pos].pre;
ans[++tot] = node[pos].val;
l=r=;
}
if(p[i] >= pos)r++;
if(p[i] <= pos)l++;
if(node[p[i]].pre != -)
{
node[node[p[i]].pre].next = node[p[i]].next;
}
if(node[p[i]].next != -)
{
node[node[p[i]].next].pre = node[p[i]].pre;
}
}
for(int i=;i<=tot;i++)
{
printf("%d",ans[tot-i+]);
if(i% != && i != tot)printf(" ");
else printf("\n");
}
}
}
Running Median POJ - 3784 (对顶堆/优先队列 | 链表)的更多相关文章
- Running Median POJ - 3784
本题使用对顶堆做法. 为了动态维护中位数,我们可以建立两个堆 :一个大根对,一个小根堆. 用法:在动态维护的过程中,设当前的长度为length,大根堆存从小到大排名 $1 \thicksim \dfr ...
- POJ 2442 Sequence堆 优先队列
题目描述 给定m个序列,每个序列包含n个非负整数.现在我们可以从每个序列中选择一个数字以形成一个具有m个整数的序列.显然,我们可以得到n ^ m种这种序列.然后,我们可以计算每个序列中的数字总和,并获 ...
- POJ 3784.Running Median
2015-07-16 问题简述: 动态求取中位数的问题,输入一串数字,每输入第奇数个数时求取这些数的中位数. 原题链接:http://poj.org/problem?id=3784 解题思路: 求取中 ...
- 【POJ 3784】 Running Median (对顶堆)
Running Median Description For this problem, you will write a program that reads in a sequence of 32 ...
- 【POJ 3784】 Running Median
[题目链接] http://poj.org/problem?id=3784 [算法] 对顶堆算法 要求动态维护中位数,我们可以将1-M/2(向下取整)小的数放在大根堆中,M/2+1-M小的数放在小根堆 ...
- poj3784 Running Median[对顶堆]
由于我不会讲对顶堆,所以这里直接传上一个巨佬的学习笔记. 对顶堆其实还是很容易理解的,想这题的时候自己猜做法也能把没学过的对顶堆给想出来.后来了解,对顶堆主要还是动态的在线维护集合$K$大值.当然也可 ...
- hdu3282 链表或者对顶堆
维护序列的动态中位数 第一次用链表做题..感觉指针指来指去也挺麻烦的.. 本题链表解法就是用数组模拟出一个链表,然后离线输入所有数,排序,按照输入顺序在链表里删除元素,一次性删掉两个,然后中位数指针对 ...
- POJ3784:Running Median
浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html 题目传送门:http://poj.org/problem?id=3784 用一个"对顶堆& ...
- 【POJ3784】Running Median
Running Median Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3406 Accepted: 1576 De ...
随机推荐
- Confluence 6 有关 AD 的一些特殊说明
当应用程序对使用 Active Directory (AD) 的 LDAP 服务器进行同步的时候,同步的任务只对 LDAP 最近修改的数据进行同步而不是对整个数据库进行同步.因为是增量同步,在第一次完 ...
- swift项目初始化并添加忽略文件Swift.ignore
1 先去GitHub上去把最新的忽略文件下载下载 https://github.com/github/gitignore 2 然后找到Swift.gitignore 把里面的 pod 前面的# 删除 ...
- selenium关于断言的使用
基本介绍: Selenium工具专门为WEB应用程序编写的一个验收测试工具. Selenium的核心:browser bot,是用JAVASCRIPT编写的. Selenium工具有4种:Seleni ...
- nginx常用命令及简单配置
nginx常用命令 nginx -c /usr/local/nginx/conf/nginx.conf 启动nginx(windows下start nginx); nginx -s quit 停止ng ...
- tomcat启动报错:Annotation-specified bean name 'patrolTrailServiceImpl' for bean class [cn.oppo.inventoryService.patrolTrailServiceImpl] con
注释-为bean类[目录服务patrolTrailServiceImpl]指定的bean名称“patrolTrailServiceImpl”与同名和[目录服务patrolTrailServiceImp ...
- js 压缩上传的图片方法(默认上传的是file文件)
//压缩图片方法 function compressImg(file,callback){ var src; var fileSize = parseFloat(parseInt(file['size ...
- css 清除浮动的几种方式
1.给浮动的元素的父级添加 overflow:hidden;属性 ul>不浮动 添加overflow:hidden; li>浮动 2.给浮动的元素的父级添加after伪类 ul:after ...
- pandas之系列操作(一)
1.读Excel: # coding=utf-8 import pandas as pd import pymysql sql_select =" xxxxx " con = py ...
- node.js(一)
安装官网: https://nodejs.org/en/ 运行代码: var http=require('http') http.createServer(function(req,res){ res ...
- Linux发布WebApi
一:WebApi 使用Owin来做 http://www.cnblogs.com/xiaoyaodijun/category/666029.html 二:安装最新版的Jexus服务 https:// ...