题解:AT_abc413_c [ABC413C] Large Queue

· · 题解

解题思路:

这道题一共有两个操作:

1 往队列尾加 kx

2 删除队列前 k 个数并输出它们的和。

对于操作 1 ,我们只需要记两个数组,分别记下 x 的值,和 x 的个数。

对于操作 2 ,我们可以用一个变量 id ,来记下删除的最后一个数的下标,这样就不用真正地删除了。对于输出,直接便利输出就行了。

AC代码:

#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
int q,a[1000001],cnt,st,sum[200001],kua[200001],num[200001];//这边其实2个就行了 
signed main() {
    cin>>q;
    while(q--) {
        int op,x,y;
        cin>>op>>x;
        if(op==1) {
            cin>>y;
            kua[++cnt]=y;
            num[cnt]=x;
            sum[cnt]=x*y;
        } else {
            int i=st+1;
            int ans=0;
            for(i=st+1; x>=num[i]&&i<=cnt; i++)ans+=sum[i],x-=num[i];
            st=i-1;
            if(i<=cnt){
            num[i]-=x;
            sum[i]=num[i]*kua[i];
            ans=ans+x*kua[i];
        }
            cout<<ans<<"\n";
        }
    }
    return 0;
}