【每日一题】12.Running Median (对顶堆)
补题链接:Here
题意:动态的维护中位数的问题,依次读入一个整数,每当总个数为奇数时输出此时序列的中位数
使用对顶堆的在线做法。
为了实时找到中位数,我们可以建议两个二叉堆:一个小根堆、一个大根堆。在依次读入数字的过程设当前序列长度为 \(M\),我们始终保持:
- 序列中从小到大排名为 \(1\) ~ $ M/2 $ 的整数存储在大根堆中;
- 序列中从小到大排名为 \(M/2 + 1\) ~ \(M\) 的整数存储在小根堆中。
任何时候如果某一个堆中元素过多则是打破了平衡需要取出该堆的堆顶插入到另一个堆。这样一来序列的中位数就是小根堆的堆顶
关于新数 \(X\) 插入:如果 \(X\) 比中位数小,则插入大根堆,否则就插入小根堆。之后再维护平衡即可
上述算法就是 “对顶堆” 算法
这个代码会爆空间,但很好的实现的上述过程
priority_queue<int> q1, q2;
void solve() {
while (q1.size()) q1.pop();
while (q2.size()) q2.pop();
int num, n;
cin >> num >> n;
cout << num << " " << (n + 1) / 2 << "\n";
int a;
cin >> a;
cout << a << " ";
q2.push(-a);
int cnt = 1;
for (int i = 2; i <= n; ++i) {
cin >> a;
if (a < -q2.top()) q1.push(a);
else
q2.push(-a);
int s = q1.size();
if (s > i / 2) {
q2.push(-q1.top());
q1.pop();
}
if (s < i / 2) {
q1.push(-q2.top());
q2.pop();
}
if (i & 1) {
cout << -q2.top() << " ";
if (++cnt % 10 == 0) cout << endl;
}
}
cout << "\n";
}
AC 代码
vector<short> a;
void solve() {
a.clear();
int k, n;
cin >> k >> n;
cout << k << " " << (n + 1) / 2 << "\n";
for (int i = 1; i <= n; ++i) {
short x;
cin >> x;
a.insert(upper_bound(a.begin(), a.end(), x), x);
if (i & 1) cout << a[(i - 1) / 2] << " ";
if (i % 20 == 0) cout << "\n";
}
cout << "\n";
}
【每日一题】12.Running Median (对顶堆)的更多相关文章
- poj3784 Running Median[对顶堆]
由于我不会讲对顶堆,所以这里直接传上一个巨佬的学习笔记. 对顶堆其实还是很容易理解的,想这题的时候自己猜做法也能把没学过的对顶堆给想出来.后来了解,对顶堆主要还是动态的在线维护集合$K$大值.当然也可 ...
- CISP/CISA 每日一题 12
CISA 每日一题(答) 支付系统模式有哪些: 电子现金模式:支付者不必在线,无条件不可追溯性 电子支票模式:支付者不必在线,涉及个人隐私 电子转帐模式:收款人不必在线 图象处理中,应该有适当的___ ...
- java面试每日一题12
题目:打印出如下图案(菱形) * *** ****** ******** ****** *** * public class Diamond { public static ...
- 【POJ 3784】 Running Median (对顶堆)
Running Median Description For this problem, you will write a program that reads in a sequence of 32 ...
- 【POJ3784】Running Median
Running Median Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3406 Accepted: 1576 De ...
- POJ 3784.Running Median
2015-07-16 问题简述: 动态求取中位数的问题,输入一串数字,每输入第奇数个数时求取这些数的中位数. 原题链接:http://poj.org/problem?id=3784 解题思路: 求取中 ...
- AcWing:106. 动态中位数(对顶堆)
依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数. 输入格式 第一行输入一个整数PP,代表后面数据集的个数,接下来若干行输入各个数据集. 每个数据集的第一行首先 ...
- 【python】Leetcode每日一题-丑数2
[python]Leetcode每日一题-丑数2 [题目描述] 给你一个整数 n ,请你找出并返回第 n 个 丑数 . 丑数 就是只包含质因数 2.3 和/或 5 的正整数. 示例1: 输入:n = ...
- Java实习生常规技术面试题每日十题Java基础(八)
目录 1.解释内存中的栈(stack).堆(heap)和静态区(static area)的用法. 2.怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串? 3.运行时异常与受检异常有 ...
- hdu 3282 Running Median
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3282 Running Median Description For this problem, you ...
随机推荐
- [ARC150F] Constant Sum Subsequence
Problem Statement We have a sequence of positive integers of length $N^2$, $A=(A_1,\ A_2,\ \dots,\ A ...
- [AGC034D] Manhattan Max Matching
Problem Statement Snuke is playing with red and blue balls, placing them on a two-dimensional plane. ...
- SpringBoot设置日志级别
输出到控制台 logging: # 日志记录到文件中 file: # 指定文件名 name: server.log logback: rollingpolicy: # 指定文件大小 max-file- ...
- ModuleNotFoundError: No module named '_pytest.resultlog'
新环境运行Python时报错 ModuleNotFoundError: No module named '_pytest.resultlog' 上网查,看到解决方法 https://www.cnbl ...
- ChatGPT 沦为了我的打工仔
大家好,我是老章 最近在折腾之前搞的R-bookdown网站.Jekyll博客,还有刚上了Astro做的周刊.Astro Starlight做的文档站 R2ML:https://r2ml.zhangl ...
- C realloc(): invalid next size错误
C realloc(): invalid next size 问题代码 #include <stdio.h> #include <stdlib.h> int *getNumbe ...
- 调试分析Linux 0.00引导程序
Bochs虚拟机的配置文件 简介 Bochs 虚拟机的配置文件 描述待启动的虚拟机的配置,例如内存大小.启动镜像.网络功能.存储配置. Bochs运行后,会先查找配置文件,解析模拟器要虚拟的系统相关信 ...
- 这些常见的python编码习惯,你都会吗
本文分享自华为云社区<不得不知的十个常见PY编码习惯>,作者:码乐. 简介 语言在发展和变化,编码习惯也在发生改变.这里简单聊聊 17个python中常见的编码习惯或者风格. 1,可变数据 ...
- 2023-11-29:用go语言,给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。 需保证 返回结果的字典序最小。 要求不能打乱其他字符的相对位置)。 输入:s = “cba
2023-11-29:用go语言,给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次. 需保证 返回结果的字典序最小. 要求不能打乱其他字符的相对位置). 输入:s = &quo ...
- flutter BLoC框架
BLoC(Business Logic Component)是一种在Flutter中用于管理状态和处理业务逻辑的设计模式和架构模式. BLoC 的核心思想是将应用程序的状态.业务逻辑和UI分离开来,以 ...