您的位置:首页 > 其它

栈 Okabe and Boxes:CodeForces - 821C

2017-09-19 19:09 543 查看

题目:

Okabe and Boxes:CodeForces - 821C

题意:

有编号1-n的n个箱子。现在有两种操作

add x

remove

操作1表示将编号为x的箱子放入栈内,操作2表示拿出栈顶的箱子。现在给出2n个操作,为了保证出栈的顺序是1~n,可以允许在操作2执行之前,将栈内元素进行排序。现在问,最少要多少次排序操作,才能保证出栈的顺序是1~n?

数据范围:1<=n<=3e5

思路:

由于n比较大,完全模拟肯定会超时。如何才能避免在数据上真的进行排序呢?我们可以发现,如果进行一次排序后,肯定是将栈内全部元素进行排序,而且排序后,这些元素相当于变成了一个整体,每次从这个整体内取箱子的话,肯定是按照大小顺序的。如果我们能执行这种整合操作,而不是去排序的话,这个时间复杂度就可以了。

有个简单的实现办法,我们将栈底作为特别标记。当需要整合的时候,就将所有元素放到栈底的后面。这样,当栈为空,而需要执行remove的时候。其实就是从整体内取箱子了,一定是成功的、不许要排序的。

代码怎么写呢?当需要排序时,直接将size=0,当做所有元素压入栈底。当size=0,执行的是remove的时候,直接忽略这个remove就可以了。

代码:

#include <cstdio>
using namespace std;
int n,s[300005],top;
int main()
{
int i,j,ans=0;
char op[15];
scanf("%d",&n);
for(i=j=1;i<=2*n;++i)
{
scanf("%s",op);
if(op[0]=='a')
scanf("%d",&s[++top]);
else
{
if(top)
{
if(s[top]==j) --top;
else top=0,++ans;
}
++ j;
}
}
printf("%d\n",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: