Codeforces Round #357 (Div. 2) - C - Heap Operations

WA * 3 + TLE *1  啊啊啊!说好的考虑问题要仔细呢?!

题意:

简单说就是,有一串操作,丢失了一部分,只有 n 个操作了, 补全操作,使得每次 getMin 得到对应的值。
输出所有操作的个数和操作序列。

解题:

用优先队列直接模拟过来的,标记一下某些位置 表示它之前还要进行哪些操作 才能做到,最后直接输出;
对于每个情况,
如果是 removeMin , 考虑队列是否为空,如果空,就要先插入一个;;
如果是 getMin ,
考虑 当前队列最小的元素 比 给出的数 大还是小,
如果小的话要把小的都出队,注意可能它们不止一个(WA了一次= =),记录一下步数;
如果大的话, 直接入队即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<queue>
using namespace std;

priority_queue<int,vector<int>,greater<int> > q;

const int maxn = 100010;
int ins[maxn],re[maxn],op[maxn];
char str[maxn][20];
int main()
{
    int n;
    while(!q.empty()) q.pop();
    scanf("%d",&n);
    int cnt = n,cr=0;
    for(int i=0;i<n;i++){
        scanf("%s",str[i]);
        if( strcmp(str[i],"removeMin") != 0 )
            scanf("%d",&op[i]);
        if(strcmp(str[i],"insert") == 0){
            q.push(op[i]);
        }
        if(strcmp(str[i],"removeMin")==0){
            if(q.empty()){
                op[i] = 0;
                ins[i] = 1; cnt++;
            }
            else q.pop();
        }
        if(strcmp(str[i], "getMin") == 0){
            if(!q.empty()){
                if(q.top() < op[i]){
                    while((q.top() < op[i]) && (!q.empty()) ){
                        re[i] ++; cnt ++;
                        q.pop();
                    }
                    if(q.top() != op[i] ) {
                        q.push(op[i]); cnt++;
                        ins[i] = 1;
                    }
                }
                if(q.top() > op[i]){
                    q.push(op[i]);
                    ins[i] = 1; cnt ++;
                }
            }
            else {
                q.push(op[i]);
                ins[i] = 1; cnt ++;
            }
        }
    }
    cout<<cnt<<endl;
    for(int i=0;i<n;i++){
        if(ins[i]) printf("insert %d\n",op[i]);
        if(re[i])
            for(int j=0;j<re[i];j++) printf("removeMin\n");
        if(strcmp(str[i], "removeMin") != 0)
            printf("%s %d\n",str[i],op[i]);
        else printf("%s\n",str[i]);
    }
    return 0;
}
时间: 2024-10-18 01:44:20

Codeforces Round #357 (Div. 2) - C - Heap Operations的相关文章

Codeforces Round #357 (Div. 2) E 计算几何

传说中做cf不补题等于没做 于是第一次补...这次的cf没有做出来DE D题的描述神奇 到现在也没有看懂 于是只补了E 每次div2都是hack前2~3题 终于打出一次hack后的三题了...希望以后能越来越好 早日..至少变成蓝色名字吧:) E题意 有一个蟑螂 人要打死它 给出蟑螂的坐标 速度 人的瞄准时间 再给出一些阴影(圆形且给出坐标与半径) 若蟑螂移动到阴影内会立即停下 人不能打到阴影中的蟑螂 问它不被打死的机率 蟑螂的移动方向是随机的 需要注意的是蟑螂只会朝一个方向走直线 所以我们对于

线段树 Codeforces Round #197 (Div. 2) D. Xenia and Bit Operations

题目传送门 1 /* 2 线段树的单点更新:有一个交叉更新,若rank=1,or:rank=0,xor 3 详细解释:http://www.xuebuyuan.com/1154895.html 4 */ 5 #include <cstdio> 6 #include <iostream> 7 #include <algorithm> 8 #include <cstring> 9 #include <string> 10 #include <c

Codeforces Round #257 (Div. 2)

A.Jzzhu and Children 计算每个人会出现的轮次数,取最后一个且轮次数最大的,注意是用a[i]-1 % m,倒着扫一遍就行了 #include <iostream> #include <cstdio> #include <cstdlib> using namespace std; const int maxn = 100+10; int n, m; int a[maxn]; int main() { #ifdef LOCAL freopen("

Codeforces Round #279 (Div. 2) ABCD

Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name     A Team Olympiad standard input/output 1 s, 256 MB  x2377 B Queue standard input/output 2 s, 256 MB  x1250 C Hacking Cypher standard input/output 1 s, 256 MB  x740 D Chocolate standard input/

Codeforces Round #259 (Div. 2) (序列)

题目链接:http://codeforces.com/contest/454/problem/B B. Little Pony and Sort by Shift time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output One day, Twilight Sparkle is interested in how to sort a se

Codeforces Round #259 (Div. 2) 题解

A. Little Pony and Crystal Mine time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Twilight Sparkle once got a crystal from the Crystal Mine. A crystal of size n (n is odd; n?>?1) is an n?×?n 

Codeforces Round #598 (Div. 3) D - Binary String Minimizing

原文链接:https://www.cnblogs.com/xwl3109377858/p/11797618.html Codeforces Round #598 (Div. 3) D - Binary String Minimizing You are given a binary string of length n (i. e. a string consisting of n characters '0' and '1'). In one move you can swap two adj

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿