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