Okabe and Boxes - CodeForces 821C - Virtual Judge
先来考虑什么时候重排最优,在remove的时候,如果栈顶元素不是需要的元素,那么此时进行重排,其余时候不重排,为什么呢,这样是让栈中积压多一些的元素,然后重排的效果更好,因为这里的重排是将栈中元素从底到顶从大到小排序,如果直接这样模拟排序操作的话,时间复杂度会比较高
这里就有一个关键观察,在完成一次排序之后,栈内当前的所有元素的顺序已经变得符合出栈顺序,所以这个时候可以直接将栈清空
例如 入栈:3 1 5 4,之后需要第一次出栈,整理后变成 5 4 3 1,则1出栈后,3,4,5的顺序已经符合出栈顺序,此时如果入栈一个2 ,变成 5 4 3 2,然后迎来第二次出栈,2出栈后,剩余5,4,3是符合顺序的,如果现在再出栈3次,那么这三个元素顺序一定正确
所以在出栈的时候,如果栈是空的,则说明当前需要出栈的元素已经在栈顶
#include<bits/stdc++.h>
using namespace std;
using ll=long long ;
const ll maxn=3e5+5;
ll cnt,n,tar;
ll a[maxn];
int main()
{
ios::sync_with_stdio(0);cin.tie(0);
cin>>n;
ll ans=0;
for(ll i=1;i<=2*n;i++){
string op;cin>>op;
if(op=="add"){
ll x;cin>>x;
a[++cnt]=x;
}else {
tar++;
if(cnt==0) continue;
if(a[cnt]==tar) cnt--;
else {
//printf("需要弹出%lld时需要排序\n",tar);
ans++;
cnt=0;
}
}
}
cout<<ans<<"\n";
return 0;
}
714

被折叠的 条评论
为什么被折叠?



