Okabe and Boxes_CodeForces - 821C题解

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值