onecode第一届一码学程正式邀请赛B 排队找bug

## 10222 : 排队找bug ##

时间限制: 1000 MS 内存限制: 131072 KB 提交总数: 125 AC总数: 24
问题描述
同学们的bug还真是多啊,orz…
春节期间大家存下的bug都来找肖老师解决了。
每个人都有bug,但是肖老师却只有一个啊。怎么办?
所以肖老师让大家按先来后到的顺序排队,一个一个的给大家解决。
这不一大早起来,肖老师就等着同学们过来解决bug了。不过肖老师偶尔想知道当前队伍中bug数量最少的是多少bug。
sos xbug操作表示有一个同学有x个bug,并且过来排队等待肖老师解决。
ok 操作表示肖老师已经解决了排在队伍最前面同学的所有bug。
min 操作表示肖老师需要知道当前排队队伍中bug数量最少的是多少bug。
输入格式
第一行输入一个正整数n,表示总共有n总操作。
接下来输入n行,每行一种操作。
【限制条件】
1≤n≤10^6
每个人的bug数量不超过1000000。

注意,数据大到用必须得用scanf,printf输入输出
输出格式
对于每一次min操作,输出当前排队中bug最少的数量。
如果执行min(或者ok)操作时,当前队伍为空,则输出“So happy!no bug!”。
样例输入
7
sos 6bug
sos 7bug
min
ok
min
ok
min
样例输出
6bug
7bug
So happy!no bug!


#include<bits/stdc++.h>
using namespace std;
queue<int> que;  
deque<int> minque;  
deque<int> maxque;  
void push(int val)  
{  
    que.push(val);  
    while ((!minque.empty()) && (minque.back() > val))  
        minque.pop_back();  
    minque.push_back(val);  
    while ((!maxque.empty()) && (maxque.back() < val))  
        maxque.pop_back();  
    maxque.push_back(val);  
}  
void pop()  
{  
    int value = que.front();  
    que.pop();  
    if (!minque.empty() && minque.front() == value)  
        minque.pop_front();  
    if (!maxque.empty() && maxque.front() == value)  
        maxque.pop_front();  
}  
int findmin()  
{  
    return minque.front();  
}  
int findmax()  
{  
    return maxque.front();  
}  
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        char op[10];
        scanf("%s",op);
        int x;
        if(op[0]=='s') 
        {
            scanf("%dbug",&x);
            push(x);
        }
        else if(op[0]=='m')
        {
            if(que.size()==0 || minque.empty()) printf("So happy!no bug!\n");
            else printf("%dbug\n",findmin());
        }
        else 
        {
            if(que.size()==0 || minque.empty()) printf("So happy!no bug!\n");
            else pop();
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/oj_onecode/article/details/81978096
今日推荐