Codeforces Round #357 (Div. 2) C. Heap Operations 模拟
C. Heap Operations
题目连接:
http://www.codeforces.com/contest/681/problem/C
Description
Petya has recently learned data structure named "Binary heap".
The heap he is now operating with allows the following operations:
put the given number into the heap;
get the value of the minimum element in the heap;
extract the minimum element from the heap;
Thus, at any moment of time the heap contains several integers (possibly none), some of them might be equal.
In order to better learn this data structure Petya took an empty heap and applied some operations above to it. Also, he carefully wrote down all the operations and their results to his event log, following the format:
insert x — put the element with value x in the heap;
getMin x — the value of the minimum element contained in the heap was equal to x;
removeMin — the minimum element was extracted from the heap (only one instance, if there were many).
All the operations were correct, i.e. there was at least one element in the heap each time getMin or removeMin operations were applied.
While Petya was away for a lunch, his little brother Vova came to the room, took away some of the pages from Petya's log and used them to make paper boats.
Now Vova is worried, if he made Petya's sequence of operations inconsistent. For example, if one apply operations one-by-one in the order they are written in the event log, results of getMin operations might differ from the results recorded by Petya, and some of getMin or removeMin operations may be incorrect, as the heap is empty at the moment they are applied.
Now Vova wants to add some new operation records to the event log in order to make the resulting sequence of operations correct. That is, the result of each getMin operation is equal to the result in the record, and the heap is non-empty when getMin ad removeMin are applied. Vova wants to complete this as fast as possible, as the Petya may get back at any moment. He asks you to add the least possible number of operation records to the current log. Note that arbitrary number of operations may be added at the beginning, between any two other operations, or at the end of the log.
Input
The first line of the input contains the only integer n (1 ≤ n ≤ 100 000) — the number of the records left in Petya's journal.
Each of the following n lines describe the records in the current log in the order they are applied. Format described in the statement is used. All numbers in the input are integers not exceeding 109 by their absolute value.
Output
The first line of the output should contain a single integer m — the minimum possible number of records in the modified sequence of operations.
Next m lines should contain the corrected sequence of records following the format of the input (described in the statement), one per line and in the order they are applied. All the numbers in the output should be integers not exceeding 109 by their absolute value.
Note that the input sequence of operations must be the subsequence of the output sequence.
It's guaranteed that there exists the correct answer consisting of no more than 1 000 000 operations.
Sample Input
2
insert 3
getMin 4
Sample Output
4
insert 3
removeMin
insert 4
getMin 4
Hint
题意
他有一个小根堆,有三种操作
1.插入一个数
2.移除最小的数
3.输出最小的数
然后他做做做,记录了其中他操作的n次
这n次可能是不满足他的操作说明的。
现在让你完善它的操作,使他满足要求。
题解:
开个优先队列,然后正着模拟一遍就好了
插入一个数没什么好说的,照着做就好了
移除最小的数的话,如果队列为空,那么得先随便插一个才行
输出最小的数,如果输出的数比队首大,那么队列得pop到队首大于等于这个数才行。如果队首不是这个数,得push进去一个数才行。
代码
#include<bits/stdc++.h>
using namespace std;
priority_queue < int , vector < int > , greater < int > > Q;
vector<pair<char,int> >ans;
char s[444];
int main()
{
int n;scanf("%d",&n);
for(int i=0;i<n;i++)
{
int p;
scanf("%s",s);
if(s[0]!='r')cin>>p;
if(s[0]=='i')
{
Q.push(p);
ans.push_back(make_pair(s[0],p));
}
else if(s[0]=='r')
{
if(Q.empty())
{
Q.push(1);
ans.push_back(make_pair('i',1));
}
Q.pop();
ans.push_back(make_pair('r',0));
}
else if(s[0]=='g')
{
while(!Q.empty())
{
int t = Q.top();
if(t<p)
{
Q.pop();
ans.push_back(make_pair('r',0));
}
else break;
}
if(Q.empty()||Q.top()>p)
{
Q.push(p);
ans.push_back(make_pair('i',p));
}
ans.push_back(make_pair('g',p));
}
}
cout<<ans.size()<<endl;
for(int i=0;i<ans.size();i++)
{
if(ans[i].first=='r')printf("removeMin ");
if(ans[i].first=='i')printf("insert ");
if(ans[i].first=='g')printf("getMin ");
if(ans[i].first!='r')printf("%d",ans[i].second);
printf("\n");
}
}
Codeforces Round #357 (Div. 2) C. Heap Operations 模拟的更多相关文章
- Codeforces Round #357 (Div. 2)C. Heap Operations
用单调队列(从小到大),模拟一下就好了,主要是getMin比较麻烦,算了,都是模拟....也没什么好说的.. #include<cstdio> #include<map> #i ...
- Codeforces Round #368 (Div. 2) B. Bakery (模拟)
Bakery 题目链接: http://codeforces.com/contest/707/problem/B Description Masha wants to open her own bak ...
- Codeforces Round #357 (Div. 2) 优先队列+模拟
C. Heap Operations time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- Codeforces Round #357 (Div. 2) C
C. Heap Operations time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- Codeforces Round #284 (Div. 2)A B C 模拟 数学
A. Watching a movie time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Codeforces Round #285 (Div. 2) A B C 模拟 stl 拓扑排序
A. Contest time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
- Codeforces Round #357 (Div. 2) E. Runaway to a Shadow 计算几何
E. Runaway to a Shadow 题目连接: http://www.codeforces.com/contest/681/problem/E Description Dima is liv ...
- Codeforces Round #357 (Div. 2) D. Gifts by the List 水题
D. Gifts by the List 题目连接: http://www.codeforces.com/contest/681/problem/D Description Sasha lives i ...
- Codeforces Round #357 (Div. 2) B. Economy Game 水题
B. Economy Game 题目连接: http://www.codeforces.com/contest/681/problem/B Description Kolya is developin ...
随机推荐
- .net HttpCrawler
using HtmlAgilityPack; using System; using System.Collections.Generic; using System.Diagnostics; usi ...
- WebApi参数问题方案
原文:http://www.cnblogs.com/landeanfen/p/5337072.html
- 缓存数据库-redis数据类型和操作(string)
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合) 一:String(字符串) string是redis ...
- gbdt和xgboost api
class xgboost.XGBRegressor(max_depth=3, learning_rate=0.1, n_estimators=100, silent=True, objective= ...
- redis持久化的两种方式
redis是一个内存型数据库.当redis服务器重启时,数据会丢失.我们可以将redis内存中的数据持久化保存到硬盘的文件中. redis持久化有两种机制.RDB与AOF.默认方式是RDB. 1.RD ...
- the server ssl certificate failed to verify
很久没上传项目之后,远程端断开联系 如果是git,就git clone,重新把项目拉下来. svn的话,就svn ls,拉下项目.
- 在 SQL Server 2005 中配置数据库邮件
一. SQL Server发邮件原理和组件介绍: 数据库邮件有4个组件:配置文件.邮件处理组件.可执行文件以及“日志记录和审核组件”. l 配置组件包括: 1)数据库邮件帐户包 ...
- C# Except
我们往往需要把一个列表中,去除另外一个列表的元素,C#提供了很好的方法,Except. 但是往往不小心就掉进坑里了. 看下面的代码: static void Main(string[] args) { ...
- Mongoose关于当天日期的查询
参考:https://blog.csdn.net/difffate/article/details/70312894 Ant Design Pro中,有关于日期的查询条件,但日期是以数字表示的 Req ...
- 2017-2018-1 20179202《Linux内核原理与分析》第十一周作业
Metasploit实现木马生成.捆绑.免杀 1.预备知识 (1)Metasploit Metasploit是一款开源的安全漏洞检测工具,全称叫做The Metasploit Framework,简称 ...