## 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!
");
else printf("%dbug
",findmin());
}
else
{
if(que.size()==0 || minque.empty()) printf("So happy!no bug!
");
else pop();
}
}
return 0;
}