Running Median( POJ - 3784,对顶堆动态维护中位数)

动态维护中位数 问题陈述:有个需要动态更新(插入或删除)的数列L,现在需要随时获取到该数列的中位数,请设计相应的数据结构和算法。   算法:令L的中位数为m,用一个大顶堆存储数列L中不大于m的元素(即L按从小到大排列时的前半部分),用一个小顶堆存储数列L中不小于m的元素(即L按从小到大排列时的后半部分),其中这两个大小顶堆均不包含中位数m。每次往数列L插入新元素x时,若x   分析:容易看 阅读详情

一.题目链接:

POJ-3784

二.题目大意:

给你 n 个数,当 i 为奇数时,输出中位数.

三.分析:

对顶堆维护即可.

另外不要 PE.

对顶堆学习

四.代码实现:

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <bitset>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-8
#define lc k * 2
#define rc k * 2 + 1
#define pi acos(-1.0)
#define ll long long int
using namespace std;

const int M = (int)1e6;
const ll mod = (ll)1e9 + 7;
const int inf = 0x3f3f3f3f;

priority_queue <int, vector<int>, less<int> > big;
priority_queue <int, vector<int>, greater<int> > small;

void init()
{
    while(!small.empty())
        small.pop();
    while(!big.empty())
        big.pop();
}

int main()
{
    int T;
    scanf("%d", &T);
    for(int ca = 1; ca <= T; ++ca)
    {
        init();
        int n;
        scanf("%*d %d", &n);
        printf("%d %d\n", ca, n / 2 + 1);
        int x;
        for(int i = 0; i < n; ++i)
        {
            scanf("%d", &x);
            if(i && !(i & 1))
            {
                if(i % 20 == 0)
                    printf("\n");
                else
                    printf(" ");
            }
            if(small.empty() || x > small.top())
                small.push(x);
            else
                big.push(x);
            if(small.size() > big.size() + 1)
            {
                big.push(small.top());
                small.pop();
            }
            if(big.size() >= small.size() + 1)
            {
                small.push(big.top());
                big.pop();
            }
            if(!(i & 1))
                printf("%d", small.top());
        }
        printf("\n");
    }
    return 0;
}

 

GROMACS+PLUMED联合安装避坑指南:为什么你的plumed patch总是失败? 本文深入解析GROMACS与PLUMED联合安装中补丁失败的常见原因,并提供详细的避坑指南。针对版本兼容性、环境配置和编译选项等关键问题,给出从源码选择、环境搭建到手动合并补丁的完整解决方案,帮助用户成功整合这两个强大的分子动力学工具,实现增强采样模拟。 阅读详情

相关推荐

给大一新生的蓝桥杯EDA备赛规划:从电路分析到立创EDA,如何用一年时间高效备赛?

本文为大一新生提供了一份系统的蓝桥杯EDA备赛规划,从电路分析基础到立创EDA实战操作,分阶段指导如何高效备赛。内容涵盖理论学习、软件操作、PCB设计专项提升及冲刺优化策略,帮助学生在一年内全面提升电子设计能力,为竞赛做好充分准备。

weixin_31476015的博客 287

POJ3784 Running Median 对顶堆

题目链接 http://poj.org/problem?id=3784 分析 动态维护序列中位数可用对顶堆实现,即用大根堆维护序列前一段,用小根堆维护序列后一段。 保证大根堆内元素均比小根堆内元素小,且两堆元素个数差不超过 111。 每次输出时,元素个数较多的堆的堆顶元素即为当前序列中位数。 AC代码 #include <cstdio> #include <vector> ...

Kevin的博客 303

Oracle 常用语法汇总

CREATE TABLE 表名(COMMENT ON COLUMN 注释;-- 创建一个学生表STUDENT_ID NUMBER(10) PRIMARY KEY, -- 学生ID,主键FIRST_NAME VARCHAR2(50) NOT NULL, -- 学生名字,不允许为空LAST_NAME VARCHAR2(50) NOT NULL, -- 学生姓氏,不允许为空EMAIL VARCHAR2(100) UNIQUE, -- 学生电子邮箱,唯一。

拽着尾巴的鱼儿的博客 2157

[POJ3784]Running Median(堆动态维护中位数)

传送门   这题需要用到一个名为:“对顶堆”的小技巧   我们以值建立一个大根堆,一个小根堆,假设我们现在的中位数是x,那么用大根堆来储存小于等于x的元素,用小根堆来储存大于x的元素,这样的话,大根堆的堆顶就是x,也就是现在的动态中位数。 那么也就是说我们保证大根堆里的元素都是小于小根堆的,你可以想象这两个堆是“顶”在一起的,他们是两个胖子互相挤来挤去,他们夹着的就是动态中位数,同时我们还...

私は Mocha!! 1400

使用 ChatGPT/Copilot 提升前端开发效率的 N 种方式

typescript// 输入:根据这个 JavaScript 对象,生成完整的 TypeScript 类型定义id: '123',stock: 50,},// ChatGPT 生成:id: string;discount?: number;// 可选属性// 只读属性// 更进一步,生成 Zod schema 用于运行时验证:});}),});AI 代码助手真正的革命性不在于它能生成多少代码,而在于它改变了我们解决问题的方式。

fineday 1592

TLSR8258蓝牙Mesh实战:从SDK下载到自定义通信指令全流程(附避坑指南)

本文详细介绍了TLSR8258蓝牙Mesh开发的完整流程,从SDK下载、环境搭建到自定义通信指令的实现。通过实战案例和避坑指南,帮助开发者快速掌握低功耗蓝牙Mesh网络构建技巧,适用于智能家居、工业监控等物联网场景。

weixin_29176179的博客 199

动态求解中位数

题意是这样的,给你一个序列寻找中位数? 其实这个可以转化为TopK问题,但是假如这个数组不断的变化呢?这个时候可以考虑使用堆来解决。 这是一个很经典的问题,值得反思和学习。 参考这一道题leetcode 295. Find Median from Data Stream 双优先级队列 + 中位数查找 代码如下: #include &lt;iostream&gt; #include &lt...

JackZhangNJU的专栏 1162

【计算机科学导论实验】加法图灵机模拟 题解

本文提供计算机科学导论课程“图灵机加法器”实验的个人思路,仅供参考。

Chavapa's blog 2577

POJ-3784 Running Median(对顶堆动态维护中位数)

POJ-3784 Running Median(对顶堆动态维护中位数) For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After each odd-indexed value is read, output the median (middle value) of the elements received so far. Input The first line

hebtu_Kangweiqi的博客 281

从模组到集装箱:手把手拆解一个储能BMS的软硬件架构设计与通信组网

本文深入解析储能BMS的软硬件架构设计与通信组网,从电芯采样到系统集成的全链条技术实现。详细介绍了三级硬件架构(AFE、CMU、BMU)的设计要点,以及软件分层实现中的驱动层、应用层核心算法和通信协议栈。通过实战案例分享CAN网络搭建、调试工具链和系统验证测试经验,为储能系统开发提供实用指导。

weixin_30752699的博客 462

协方差矩阵自适应进化策略(CMA-ES)详解:从基础原理到优化算法

CMA-ES是一种先进的无导数优化算法,基于生物进化原理解决连续域非线性优化问题。该算法通过自适应调整多元正态分布的均值、协方差矩阵和步长参数,自动学习搜索空间结构,无需梯度信息即可高效优化。核心创新包括协方差矩阵的秩1和秩μ更新策略,以及基于进化路径的步长控制机制。CMA-ES具有旋转不变性、标度不变性和全局探索能力,特别适合3-300维的黑盒优化问题,在复杂系统仿真、超参数调优等领域表现优异。算法实现中关键参数如种群大小、学习率等均有自适应设置规则,使其成为连续优化领域的基准算法之一。

qq_42212808的博客 524

poj3784 Running Median(对顶堆动态维护中位数)

Total Submissions: 4464 Accepted: 1992 Description For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After each odd-indexed value is read, outpu...

一身清贫怎敢入繁华 485

TC3XX - MCAL知识点(一):新建Tc3xx EB-tresos工程

基于EB-tresos建立Hightec或者Tasking工程的时候,第一个步骤就是需要新建一个EB-tresos的工程,本文记录一下如何新建一个EB-tresos工程,以及对其进行简单的操作。那么Tc3xx的MCAL包含哪些内容呢?

梦想技术家 2968

Running Median POJ - 3784(动态维护中位数问题:”对顶堆“算法/链表+hash)

题意:传送门 题解:动态维护中位数问题,两种解法,解法一是使用对顶堆,建立两个二叉堆,一个小根堆,一个大根堆,依次读入的过程中,设当前长度为MMM,始终保持: 序列中从小到大排名为1∼M21 \sim \frac{M}{2}1∼2M​的整数存储在大根堆priority_queue<int> max_heap中。 序列中从小到大排名为M2∼M\frac{M}{2}\sim M2M​∼M...

肘子的博客 359

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

POJ 3784 Running Median

POJ 3784 Running Median POJ传送门 Description For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After each odd-indexed value is read, output the median (...

anhaoti3785的博客 143

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

算法竞赛进阶指南 未完成例题/习题

第一章 P16 POJ3889 分形 Fractal Streets P18 CH0302 非递归实现组合型枚举

Waimo的博客 365

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

poj3784 Running Median[对顶堆]

由于我不会讲对顶堆,所以这里直接传上一个巨佬的学习笔记。 对顶堆其实还是很容易理解的,想这题的时候自己猜做法也能把没学过的对顶堆给想出来。后来了解,对顶堆主要还是动态的在线维护集合$K$大值。当然也可以带删除。但是可能退化,具体见另外一个题的说明。 像这题维护中位数就是要求第$N/2+1$大的数,所以可以让大根堆维护前$n/2$项,小根堆维护后$n/2+1$项(这里指排好序的)。然后...

dianer2977的博客 155

【POJ3784】Running Median

动态维护中位数的题目。 我们采用对顶堆做法,建立一个大根堆存储前半段序列(排序后),小根堆存储后半段序列,通过维护两个堆使得他们元素个数之差不大于1 ,这样这个序列的中位数就是大根堆的堆顶。 关于如何维护对顶堆:如果两个堆元素个数差大于1,我们就把大根堆的堆顶放到小根堆当中(或是把小根堆堆顶放到大根堆当中)直到两个堆“平衡”为止。 ps:当堆空时调用top会导致RE,所以调用top前务必保证...

weixin_30752699的博客 127

【对顶堆】 POJ3784 Running Median

Description For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After each odd-indexed value is read, output the median (middle value) of the elements recei...

Whyckck的博客 307

POJ - 3784 Running Median(动态维护中位数)

题目链接:点击查看 题目大意:给出n个数,依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数 题目分析:动态维护中位数,我们可以直接用两个二叉堆来维护,一个是小顶堆,一个是大顶堆,让大顶堆在中位数左侧,让小顶堆在中位数右侧,两个二叉堆堆顶相接拼起来,因为每次需要询问的是奇数时候的中位数,所以每次的中位数一定是确定的,这个时候我们可以将当前中位数保存在大顶堆...

Falcon的博客 559

poj3784 Running Median 题解报告(对顶堆)

题目传送门 【题目大意】 读入一个整数序列,每当已经读入的整数个数为奇数时,输出已经读入的整数构成的序列的中位数。 【思路分析】 这题可以使用“对顶堆”的在线做法。为了动态维护中位数,我们可以建立两个二叉堆,一个小根堆、一个大根堆。在以此读入序列的过程中,设当前读入的序列长度为$L$,我们始终保持: 1.序列中从小到大排名为$1~\frac{M}{2}$的整数储存在大根堆中 ...

weixin_30662849的博客 206

POJ3784:Running Median

浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html 题目传送门:http://poj.org/problem?id=3784 用一个“对顶堆”动态维护中位数。 一个大根堆维护前半部分的权值,一个小根堆维护后半部分的权值。 新进来一个数如果小于大根对的权值就加进大根对,否则就加进小根堆。 每次动态维护大小,使得大根堆的大小为数字的一半。 大根...

aga28832的博客 189

【POJ 3784】 Running Median

【题目链接】 http://poj.org/problem?id=3784 【算法】 对顶堆算法 要求动态维护中位数,我们可以将1-M/2(向下取整)小的数放在大根堆中,M/2+1-M小的数放在小根堆中 每次插入元素时,先将插入元素与小根堆堆顶比较,如果比堆顶小,则插入小根堆,否则,插入大根...

104

POJ3784 Running Median

动态维护中位数 对顶堆 #include&lt;cstdio&gt; #include&lt;queue&gt; using namespace std; const int maxn = 1e4; int a[maxn]; priority_queue&lt;int,vector&lt;int&gt;,greater&lt;int&gt; &gt; smallheap; priority_q...

kkjy_00的博客 187
上一篇: 七夕祭(算法竞赛进阶指南 P29,中位数 + 思维 ?)
下一篇: 黑匣子(落谷P1801,对顶堆动态维护动态第 k 小值)
The___Flash
博客等级 码龄8年 79粉丝 223原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值