CF #470 div2-C 模拟

解题思路:设ST[i]为Ti的前i项和,我们将Vi+ST[i-1]插入一个set中,然后在set中小于ST[i]的元素全部删除,这说明这些堆的雪已经被用完了,那么他们剩下的肯定不足Ti,算他们剩余的就是Vi+STi-1 - STi + Ti就是用完之前还剩下的量,那么set里面还有的个数就是可以给满Ti雪的堆了


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mx = 1e5 + 10;
int n,m;
int a[mx],b[mx];
ll sum[mx],ans[mx];
multiset <ll> st;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",a+i);
    for(int i=1;i<=n;i++){
        scanf("%d",b+i);
        sum[i] = sum[i-1] + b[i];
    }
    ll num = 0;
    for(int i=1;i<=n;i++){
        ll ret = sum[i-1] + a[i],ans = 0;
        int k = upper_bound(sum,sum+1+n,ret) - sum;
        st.insert(ret);
        num += b[i];
        for(auto it=st.begin();*it<num&&it!=st.end();)
        {
            ans += *it - num + b[i];
            st.erase(it++);
        }
        ans += 1ll*st.size()*b[i];
        printf("%I64d%c",ans,i==n?'\n':' ');
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值