题目链接;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 }