原题地址:http://codeforces.com/contest/923/problem/B
题意:有个人每天都会弄一堆雪在院子里面,然后天气很热,每天雪都会融化当前温度的体积,直到这堆雪融化完了,问你每天会融化多少雪。
思路:用优先队列维护每一堆雪,注意每一堆雪都要加上之前的重量,这样主要是便于处理,只要堆顶元素比当前前缀和小,那么就可以出队列了.
#include <bits/stdc++.h>
#define eps 1e-8
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define CLR(x,y) memset((x),y,sizeof(x))
#define fuck(x) cout<<"["<<"x = "<<(x)<<"] "
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int seed = 131;
const int maxn = 1e5 + 5;
const int mod = 998244353;
int n;
int v[maxn], t[maxn];
ll sum[maxn];
ll ans[maxn];
priority_queue<ll,vector<ll>, greater<ll> >q;
int main() {
scanf ("%d", &n);
for (int i = 1; i <= n; i++) {
scanf ("%d", &v[i]);
}
for (int i = 1; i <= n; i++) {
scanf ("%d", &t[i]);
sum[i] = sum[i - 1] + t[i];//前缀和
}
for (int i = 1; i <= n; i++) {
ll ans = 0;
q.push (v[i] + sum[i - 1]);//要加上前缀和
while (!q.empty() && q.top() <= sum[i]){
ans += q.top() - sum[i - 1];//表示当前所融化的
q.pop();
}
ans += q.size() * t[i];//还没融化的统一处理
printf ("%I64d ", ans);
}
return 0;
}