wikioi 2573 大顶堆与小顶堆并用

2024-06-08 23:38
文章标签 并用 大顶 wikioi 小顶 2573

本文主要是介绍wikioi 2573 大顶堆与小顶堆并用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们使用黑匣子的一个简单模型。它能存放一个整数序列和一个特别的变量i。在初始时刻,黑匣子为空且i等于0。这个黑匣子能执行一系列的命令。有两类命令:

ADD(x):把元素x放入黑匣子;GET:把i加1的同时,输出黑匣子内所有整数中第i小的数。牢记第i小的数是当黑匣子中的元素已非降序排序后位于第i位的元素。

下面的表6_4是一个11个命令的例子:

表6_4

编号

命令

i

黑匣子内容

输出

1

ADD(3)

0

3

 

2

GET

1

3

3

3

ADD(1)

1

1,3

 

4

GET

2

1,3

3

5

ADD(-4)

2

-4,1,3

 

6

ADD(2)

2

-4,1,2,3

 

7

ADD(8)

2

-4,1,2,3,8

 

8

ADD(-1000)

2

-1000,-4,1,2,3,8

 

9

GET

3

-1000,-4,1,2,3,8

1

10

GET

4

-1000,-4,1,2,3,8

2

11

ADD(2)

4

-1000,-4,1,2,2,3,8

 

现需要一个有效的算法处理给定的一系列命令。ADD和GET命令的总数至多个有30000个。定义ADD命令的个数为M个,GET命令的个数为N个。我们用下面得两个整数序列描述命令序列:

1.A(1),A(2),……,A(M):加入黑匣子的元素序列。所有的数均为绝对值不超过2000000的整数。例如在上例中A=(3,1,-4,2,8,-1000,2)。

2.u(1),u(2),……,u(N):u(i)表示第i个GET命令在第u(i)个ADD命令之后,例如在上例中,u=(1,2,6,6)。

你可以假定自然数序列u(1),u(2),……,u(N)以非降序排列,N≤M,且对于每一个p(1≤p≤N)有p≤u(p)≤M。

第一行存放M和N的值,第二行存放 A(1),A(2),……,A(M) ,第三行存放u(1),u(2),……,u(N)。

输出黑匣子的处理结果。

7 4

3 1 -4 2 8 -1000 2

1 2 6 6

3

3

1

2


刚开始并不知道这题该如何下手,知道是堆做了。但是具体也不知道怎么做。

看了这第二个解题报告了才知道如何做:http://www.wikioi.com/solution/list/2573/(第二个解题报告,思想很好)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<bitset>
#define INF 100007
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
priority_queue<int,vector<int>,greater<int> >heap_small;
priority_queue<int>heap_big;
int a[30005],b[30005];
int main()
{int n,k,i,j,ii=0,jj=-1;cin>>n>>k;for(i=1; i<=n; i++)scanf("%d",a+i);for(i=0; i<k; i++)scanf("%d",b+i);for(i=1; i<=n; i++){if(jj<ii) heap_big.push(a[i]),jj++;else{int ans=heap_big.top();if(a[i]>=ans) heap_small.push(a[i]);else{heap_big.pop();heap_small.push(ans);heap_big.push(a[i]);}}while(i==b[jj]){printf("%d\n",heap_big.top());ii++;if(jj+1<k&&i==b[jj+1]){int ans=heap_small.top();heap_small.pop();heap_big.push(ans);jj++;}else break;}if(ii>=k) break;}return 0;
}


这篇关于wikioi 2573 大顶堆与小顶堆并用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1043640

相关文章

MQTT broker搭建并用SSL加密

系统为centos,基于emqx搭建broker,流程参考官方。 安装好后,用ssl加密。 进入/etc/emqx/certs,可以看到 分别为 cacert.pem CA 文件cert.pem 服务端证书key.pem 服务端keyclient-cert.pem 客户端证书client-key.pem 客户端key 编辑emqx配置:vim /etc/emqx/emqx.conf,添加s

python遍历目录下的所有目录和文件,并用opencv从mp4文件中抽帧得到图片

做深度学习训练的时候,需要从mp4视频文件中抽帧得到图片数据,其中mp4文件是保存在一个大文件夹下的不同子文件夹下面的,用下面的python脚本实现 import cv2import os"""根据传入的目录参数,得到该目录所有子文件夹下的所有的mp4文件"""def get_mp4path(main_dir):list_mp4 = []for root, dirs, files in o

【Java 优先队列(小顶堆) 分治法 实现合并k个排序链表】

合并k个排序链表 题目:力扣-合并k个排序链表[https://leetcode.cn/problems/vvXgSW/](https://leetcode.cn/problems/vvXgSW/)优先队列(小顶堆)法代码实现 分治法代码实现 题目:力扣-合并k个排序链表https://leetcode.cn/problems/vvXgSW/ 给定一个链表数组,每个链表都已经

安装sqlserver并用myeclipse访问之

之前都是用mysql现在项目要求用sqlserver,现把安装配置连接步骤总结如下: 安装sqlserver数据库 网上安装资源很多,我从这里下载的安装版:http://free.zolsky.com/activation/soft/21.htm 下好后按照教程装好,教程可参见: 在安装时应该要输入一个秘钥,秘钥在此:http://zhidao.baidu.com/question/87326

利用命令行从youtube下载影片,并用huggingface的大语言模型翻译成中文

今天,从网络流媒体上下载字幕,并把它翻译成各种语言是一个非常常规的操作。 我创建了一个工作流程。可以根着这个工作流程,从网上先下载影片,然后转出字幕,最后再做翻译。 https://github.com/victorspaceRMW/download-Youtube-with-yt-dlp-and-translate-with-HuggingFace-s-whisper-model/tree/

【C++】大顶堆(最大堆)手工模拟优先队列

前言 本文采用结构体重载比较运算符的方式进行大根堆的建立,算法逻辑类似 S T L STL STL的 p r i o r i t y _ q u e u e priority\_queue priority_queue。 结构体 堆本身就是一颗完全二叉树,所以本身用数组存储就行。 int heap[N]; 输入堆 for(int i=1;i<=n;i++} cin>>heap[i];

ffmpeg解封装rtsp并录制视频-(2)使用VLC模拟一个rtsp服务器并用ffmpeg解封装该rtsp流

VCL模拟服务器并打开播放该视频文件: - 准备好一个mp4文件,打开vlc软件     - 选择“媒体”=》“流”     - 添加一个mp4文件     - 点击下方按钮选择“串流”     - 下一步目标选择rtsp 点击“添加”     - 端口默认8554     - 路径设置 /test     - 用另一个vlc打开串流播放     - rtsp://127.0.0.1:8554/

堆:什么是大顶堆,什么是小顶堆,堆排序,代码实现堆排序

堆排序代码 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 堆排序___顺序存储{class Program{static void Main(string[] arg

poj 2573 Bridge(贪心:过河问题)

开始以为排完序每次直接取相邻的就可以了呢 还以为是考察数据结构的题 WA了之后看别人的题解才知道这是一类问题 在这道题目中分析4个人 “a b c d” 过河情况: 把多种情况列出来会发现只有两种情况可能是最优的 第一种:最快的带最慢的 a c a a d a 第二种:最快的带最慢的和次快的带次慢的 a b a c d b 对于n > 3按照上面策略多次处理,每次可以

Go 实现 nginx log 读取 分析 写入InfluxDB 并用Grafana 显示

参考:慕课网https://www.imooc.com/learn/982 1. 系统结构 用Go实现文件读取,并且将log 分析并写入InfluxDB,最后用通过配置Grafana 显示 log file –>log process –> influxdb –> grafana 监控需求:某个协议下的某个请求在某个请求方法的QPS和响应时间和流量 2. Go 接收 Go 并发执行