codeforcse基础题——#357(div2)C

来源:互联网 发布:mac电脑开机问号文件夹 编辑:程序博客网 时间:2024/05/01 19:59

#357(div2)C

题目大意 : 有一个小根堆, 支持插入, 查询堆顶, 删除堆顶三个操作, 现在给你长度为n(n <= 100000)一个不完整的操作序列, 让你在其中加入最少的操作使其合法, 输出最小操作数及方案。题解: 直接模拟即可, 依次读入操作, 只有查询堆顶时可能有不合法的情况, 这时只要一直将堆顶弹出, 直到堆顶大于查询的值, 在将查询的值插入, 就能使操作合法。(写的时候注意一些细节…)
#include <cstdio>#include <queue>#include <iostream>using namespace std;typedef long long LL;priority_queue<int, vector<int>, greater<int> >q;char ty[100010][10];LL d[100100], ans[500100], ans0[500100];int main(){    int n, x, sum = 0;    scanf("%d", &n);    for (int i = 1; i <= n; i ++){        cin >> ty[i];        if (ty[i][0] != 'r') scanf("%I64d", &d[i]);    }    for (int i = 1; i <= n; i ++){        if (ty[i][0] == 'i'){            q.push(d[i]);            ans[++ sum] = 1, ans0[sum] = d[i];        }        else if (ty[i][0] == 'r'){            if (q.empty()){                ans[++ sum] = 1, ans0[sum] = 0;                q.push(0);            }            q.pop();            ans[++ sum] = 2;        }        else {            while((!q.empty()) && q.top() < d[i]){                //printf("*");                ans[++ sum] = 2;                q.pop();            }            if ((q.empty()) || q.top() != d[i]){                q.push(d[i]);                ans[++ sum] = 1, ans0[sum] = d[i];                ans[++ sum] = 3, ans0[sum] = d[i];            }            else{                ans[++ sum] = 3, ans0[sum] = d[i];            }        }    }    printf("%d\n", sum);    for (int i = 1; i <= sum; i ++){        if (ans[i] == 1) printf("insert %I64d\n", ans0[i]);        else if (ans[i] == 2) printf("removeMin\n");        else if (ans[i] == 3) printf("getMin %I64d\n", ans0[i]);            }    return 0;}
0 0