题解 P6013 【压岁钱】

· · 题解

纯模拟,要理解好题意。

小 Z 把自己的 a 元钱封印了起来,只有当第 b 个事件发生前 1 秒才会解除封印,并保证每次小 Z 现有的钱大于等于封印的钱。

这里可能有点歧义。

这个保证是针对数据而言,也就是我们在第三个操作不用任何判断,只当是直接封印。

然后。。。

十年OI一场空,不开long long见祖宗。

然后整个数组记录封印的钱就好了。

#include <bits/stdc++.h>
using namespace std;
const int N=1e8+5; 
unsigned long long m,n,ans;//rt,money,answer
unsigned long long f[N];//f[i]表示第i个事件前要解封的钱
int main()
{
    cin>>m;
    for(unsigned long long i=1,t;i<=m;i++)
    {
        n+=f[i];
        cin>>t;
        if(t==1)
        {
            unsigned long long a;
            cin>>a;
            n+=a;
        }
        else if(t==2)
        {
            unsigned long long a;
            cin>>a;
            if(n<a)ans++;
            else n-=a;
        }
        else{
            unsigned long long a,b;
            cin>>a>>b;
            f[b]+=a;
            n=n-a;
        }
    }
    cout<<ans<<endl;
    return 0;
}