1.O - 优先队列 CodeForces - 948C
Alice likes snow a lot! Unfortunately, this year’s winter is already over, and she can’t expect to have any more of it. Bob has thus bought her a gift — a large snow maker. He plans to make some amount of snow every day. On day i he will make a pile of snow of volume Vi and put it in her garden.
Each day, every pile will shrink a little due to melting. More precisely, when the temperature on a given day is Ti, each pile will reduce its volume by Ti. If this would reduce the volume of a pile to or below zero, it disappears forever. All snow piles are independent of each other.
Note that the pile made on day i already loses part of its volume on the same day. In an extreme case, this may mean that there are no piles left at the end of a particular day.
You are given the initial pile sizes and the temperature on each day. Determine the total volume of snow melted on each day.
Input
The first line contains a single integer N (1 ≤ N ≤ 105) — the number of days.
The second line contains N integers V1, V2, …, VN (0 ≤ Vi ≤ 109), where Vi is the initial size of a snow pile made on the day i.
The third line contains N integers T1, T2, …, TN (0 ≤ Ti ≤ 109), where Ti is the temperature on the day i.
Output
Output a single line with N integers, where the i-th integer represents the total volume of snow melted on day i.
Examples
Input
3
10 10 5
5 7 2
Output
5 12 4
Input
5
30 25 20 15 10
9 10 12 4 13
Output
9 20 35 11 25
Note
In the first sample, Bob first makes a snow pile of volume 10, which melts to the size of 5 on the same day. On the second day, he makes another pile of size 10. Since it is a bit warmer than the day before, the first pile disappears completely while the second pile shrinks to 3. At the end of the second day, he has only a single pile of size 3. On the third day he makes a smaller pile than usual, but as the temperature dropped too, both piles survive till the end of the day.
2.题目大意
每天都会有体积为Vi的一堆雪,所有存在的雪每天都会融化Ti体积,求出每天具体融化的雪的体积数。(Note那里也可以看出来)
3.解题思路
用sum[i] 记录第i天的温度前缀和,其中我们假设第i天的雪堆是由sum[i-1] + v[i]这么多的。 因为sum[i-1]是前i-1天温度消融掉了的。所以到了第i天的时候体积就是v[i]; 然后在每天的计算中 q.push(v[i] + sum[i-1]);将v[i] +sum[i-1]放进一个优先队列中。
A.ans = q.size()*t[i] 是第i天如果所有雪堆的雪都够融化的话,所能够融化的体积
B.因为第i天的时候并不是说所有雪堆的雪都是够融化的,有些雪堆的体积可能比小,这个时候我们就需要将ans减去多加上的那一部分。这一步通过q.top() 与sum[i]来进行比较:首先q.top() = sum[i-1] + v[i], 然后sum[i] = sum[i-1] + t[i],就是比较当前的v[i]和t[i],如果雪堆体积不足够消耗,那么ans也要减去q.top-sum[i],
这个雪堆的体积将清零q.pop().进行循环直到q.top比sum[i]大。
#include <iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<cstring>
#include<string>
#include<queue>
#define LL long long int
#define mst(a) memset(a,0,sizeof(a))
using namespace std;
const int maxn=1e5+10;
LL v[maxn],t[maxn],fin[maxn],sum[maxn];
//priority_queue优先队列,插入进去的元素都会从大到小排好序
//priority_queue<int, vector<int>, cmp>q; //定义方法
//priority_queue<LL,vector<LL>,greater<LL> >q;
//其中,第二个参数为容器类型。第三个参数为比较函数。
int main()
{
int n ; scanf("%d" ,&n);
priority_queue<LL,vector<LL>,greater<LL> >q;
int j =1;
mst(sum);
for(int i =1; i<=n; i++) scanf("%lld",&v[i]); //体积
for(int i = 1; i<=n; i++) scanf("%lld", &t[i]), sum[i] = sum[i-1] + t[i];//sum[i] 是第i天的温度前缀和
//其中我们假设第i天的雪堆是由sum[i-1] + a[i]这么多的。 因为sum[i-1]是前i-1天温度消融掉了的。所以到了第i天的时候体积就是a[i];
//a[i]+sum[i-1](第i天要使雪堆融化的雪量),sum[i](实际到该天一共融化的雪量);
for(int i= 1; i<=n; i++)
{
q.push(v[i] + sum[i-1]);
LL ans = q.size() * t[i];//当天的温度*还有几堆雪
// printf("%d %lld\n",q.top(), sum[i]);
while(q.size() && q.top() <= sum[i]) // 找雪不够融的天pop掉,并且那天多加的减去
{
ans += q.top() - sum[i];
q.pop();
}
printf("%lld ",ans);
}
return 0;
}