算法竞赛进阶指南---0x18(对顶堆) Black Box

news/2024/5/20 8:37:27 标签: 优先队列,

题面

在这里插入图片描述

题解

在这里插入图片描述

  1. 我们可以用对顶来维护一个有序的序列,如图我们只要维护大根中的元素是i-1个,那么小根顶就是按升序排序后的第i个数,接下俩看两个操作
  1. 对于GET操作,先让i++,然后输出排序后的第i个数,但是题中给定的数组是先输出,后i++(看题),那么我们每次先输出right(小根)的顶,然后i++,那么left(大根)中的元素就应该加+1,我们只需要将小根顶放入大根中即可维护
  1. 对于ADD操作,如果插入的这个a[i]>=right.top||left.empty(),那么我们直接放入小根中即可,因为我们不需要维护小根的大小,如果a[i]<right.top,那么我们就要将a[i]放入大根中,但是此时大根中的元素个数增加了,所以我们还要维护一下大根中元素的个数,那么就要将大根顶放入小根中即可

代码

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>


using namespace std;
const int N = 3e4 + 10;

int n, m;
int a[N], b[N];

int main() {

    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    cin >> m >> n;

    for (int i = 0; i < m; i++) cin >> a[i];
    for (int i = 0; i < n; i++) cin >> b[i];

    sort(b, b + n);

    priority_queue<int> left;
    priority_queue<int, vector<int>, greater<int>> right;

    int i = 0, j = 0;
    while (i < m || j < n) {
        //GET操作
        while (j < n && b[j] == i) {
            cout << right.top() << endl;
            left.push(right.top());
            right.pop();
            j++;
        }

        //ADD操作
        if (left.empty() || a[i] >= right.top()) right.push(a[i]);
        else {
            left.push(a[i]);
            right.push(left.top());
            left.pop();
        }
        i++;

    }

    return 0;
}

http://www.niftyadmin.cn/n/1572297.html

相关文章

用计算机套路别人,用别人的套路来设计我的课题!

我叫林平之&#xff0c;是莫愁师姐的师弟&#xff0c;前几天你们也看到了&#xff0c;这么多“灌水”杂志啊&#xff01;可是&#xff0c;我都投不上……因为&#xff0c;我压根都没有什么思路&#xff0c;也不知道要做些啥。莫愁&#xff1a;科研思路还不简单&#xff0c;看文…

计算机文化基础0008 17秋在线作业1,川大《计算机文化基础0008》17秋在线作业1(100分)...

1: 单选题 (2分)/ l4 i4 c2 q9 s# T; Y: F) ?, d( A: g E下列各类计算机程序语言中&#xff0c;( )不是高级程序设计语言。4 V$ V$ K6 X1 _; DA: 汇编语言A* t W% u8 k7 g) t6 a4 I2 DB: FORTRAN语言# i# K6 ?6 E I* RC: PASCAL语言0 k! o2 C: M0 i6 E YD: C语言; w;…

算法进阶指南---0x18(二分+hash)匹配统计

原题链接 题解 此题可以用KMP写&#xff0c;也可以用hash写&#xff08;简单&#xff09;&#xff0c;我们先用hash写 我们先预处理出A和B的hash&#xff0c;然后枚举A的后缀字串所能匹配的B的最大长度&#xff0c;统计长度即可 对于A的每个后缀字串&#xff0c;我们可以用二分…

计算机二级班级排名公式,Excel中快速计算班级名次和年级名次,这样的方法值得借鉴...

这里有一份高一年级的月考成绩单&#xff0c;各科成绩已经统计完毕&#xff0c;共有627名学生参加考试&#xff0c;现在需要计算每名学生的总分和班级名次、年级名次。数据整理首先需要解决的一个问题是有些学生缺考&#xff0c;对应单元格数据为0&#xff0c;需要将其删除&…

算法进阶指南---0x18(KMP)匹配统计

原题链接 题解 hash前面已经讲过了&#xff0c;我们再用KMP做一下&#xff0c;对于KMP我们先要了解ne数组&#xff1a;next[i]j 以i为终点的后缀和从1开始的非平凡前缀最大重合是j 我们先对B预处理出ne&#xff0c;然后对A进行匹配 for (int i 1, j 0; i < n; i) {while (…

计算机控制双积分系统,《计算机控制系统》复习要点(修订版)

《计算机控制系统》复习要点《计算机控制系统》知识要点一、基本概念1、 计算机控制系统比模拟控制系统的效果好。二者比较&#xff0c;计算机控制系统的功能特征有&#xff1a;①以软件代替硬件的灵活控制&#xff1b;② 历史数据可永久保存&#xff1b;③人机交互极其方便&am…

算法竞赛进阶指南---0x12(队列) 蚯蚓

题面 题解 m次操作&#xff0c;每次都要将一个最大的切成两段&#xff0c;然后再加上一个偏移量&#xff0c;然后将两段全部放入队列中&#xff0c;但是这样是O&#xff08;mlogm&#xff09;&#xff0c;看题中数据范围肯定会超时&#xff0c;那么我就要继续优化 我们可以发现…

计算机入门2018平时作业,2018华南理工大学网络教育计算机应用基础平时作业

二、论述题。(共5题)1.画出计算机指令的执行过程图&#xff0c;并说明计算机的工作原理。(12分)2.在Windows7中&#xff0c;用户可以通过网络和远程桌面功能轻松地管理其他的计算机&#xff0c;若想实现远程控制&#xff0c;如何对计算机进行设置&#xff1f;(12分)(1)取指令&a…