题目描述
给你一个n;  以栈的方式乱序存入n个数  其中有两个操作
add x 压入一个x元素;
remove 出栈  
保证 会压入n 个元素并且会将n个元素弹出 现在需要你按小到大的元素弹出来  当发现不满足条件时你能改变栈的顺序  问你最少需要排多少次才能从小到大弹出;
1 ≤ n ≤ 3·10^5
分析:问题要我们回答次数  所以并不用真正去排它(并且也会超时) 所以只需要记录前多少我排了,当到这里时直接出栈就好;
#include<bits/stdc++.h>
using namespace std;
int main(){
//    FILE *fp;
//    fp=fopen("1.txt","r");
   int n;
   char s[10];
   int x,ans=0,index=1;
   scanf("%d",&n);
   int sta[300005];
   int top=1,i=1;
   n*=2;
   while(n--){
    scanf("%s",s);
   if(s[0]=='a') {scanf("%d",&x);sta[top++]=x;}
   else {
        if(sta[top-1]==i||top<=index);
        else {
            ans++;
            index=top;
        }
        if(top<=index) index--;
        top--,i++;
//        for(int i=1;i<top;i++)
//            cout<<sta[i]<<endl;
   }
//   cout<<top<<' '<<index<<endl;
   }
   cout<<ans<<endl;
}
也可以用栈写 遇到不满足条件的就全部清空,当下次遇到空时表示这里满足条件