Codeforces Round #420 (Div. 2) C. Okabe and Boxes(O(n)做法)

题目链接;Codeforces Round #420 (Div. 2) C. Okabe and Boxes

题意:

给你一些操作,add 一个数,remove一个数,这些操作都是在栈上进行。

现在让你将所有remove的数要按照1到n的顺序。

问你至少要重新排序几次。

题解:

其实一个优先队列+一个vector就可以过了的,这里贴一个O(n)的做法。

首先开一个数组当作栈S使用,将add的数放进栈里。

如果满足要要取得话,就正常按着栈S的顺序操作。

如果不满足要求,此时就必须从新排序,然后我们就将栈S清空。

记录一下当前应该输出什么,top就是什么。如果栈S还有元素,那么top就为栈顶。

然后就可以O(n)过去了。

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;++i)
 3 using namespace std;
 4 
 5 const int N=3e5+7;
 6 int n,ans,S[N];
 7 int main(){
 8     scanf("%d",&n);
 9     char op[10];
10     int x,top=0,size=0,now=1;
11     while(~scanf("%s",op))
12     {
13         if(op[0]=='a')
14         {
15             scanf("%d",&x);
16             top=x,S[++size]=x;
17         }
18         else
19         {
20             if(top!=now)ans++,size=0,top=++now;
21             else
22             {
23                 if(size)size--;
24                 if(size)top=S[size],++now;
25                 else top=++now;
26             }
27         }
28     }
29     printf("%d
",ans);
30     return 0;
31 }
View Code
原文地址:https://www.cnblogs.com/bin-gege/p/7079258.html