解题思路:设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;
}