codeforces 948C Producing Snow

版权声明:本文为博主原创文章,可以随意转载。 https://blog.csdn.net/qq_32126633/article/details/79535608
C. Producing Snow
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

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
Copy
3
10 10 5
5 7 2
Output
5 12 4
Input
Copy
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.

题目大意

有个人每天都会弄一堆雪在院子里面,然后天气很热,每天雪都会融化当前温度的体积,直到这堆雪融化完了,问你每天会融化多少雪。

思路

这个题目开始想多了,很烦,其实还是比较简单的,就求出每堆雪会在哪天融化完的,还有融化当天比平常少融化多少,减去就好了。但是在求哪天融化的时候,必须优化一点,否则时间不够,优化的时候,后面加入的雪堆就当做一开就存在,这样就只要一次扫描就可以求出所有的雪堆哪天融化的,用了一下lower_bound()这个函数,可以快速求出雪堆是哪天融化的.

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <vector>
#include <stack>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#define ll long long
using namespace std;
const int maxn = 100005;
struct node
{
    ll n;
    ll total;
} pi[maxn];
ll v[maxn], t[maxn];
ll num[maxn];
void init()
{
    for (int i = 0; i < maxn; i++)
    {
        pi[i].n = 0;
        pi[i].total = 0;
        v[i] = 0;
        t[i] = 0;
        num[i] = 0;
    }
}

int main()
{
    freopen("test.txt", "r", stdin);
    // freopen("test.out","w",stdout);
    int n;
    while (~scanf("%d", &n))
    {
        init();
        for (int i = 1; i <= n; i++)
        {
            scanf("%lld", &v[i]);
        }
        for (int i = 1; i <= n; i++)
        {
            scanf("%lld", &t[i]);
            v[i] += num[i - 1];
            num[i] = num[i - 1] + t[i];
        }
        for (int i = 1; i <= n; i++)
        {
            if (v[i] > 0)
            {
                int a = lower_bound(num, num + n + 1, v[i]) - num;
                if (num[a] >= v[i])
                {
                    if (pi[a].n > 0)
                    {
                        pi[a].n++;
                        pi[a].total += num[a] - v[i];
                    }
                    else
                    {
                        pi[a].n = 1;
                        pi[a].total = num[a] - v[i];
                    }
                }
            }
            else
            {
                pi[i].n++;
                pi[i].total += t[i];
            }
        }
        int cou = 0;
        for (int i = 1; i <= n; i++)
        {
            printf("%lld ", t[i] * (i - cou) - pi[i].total);
            cou += pi[i].n;
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_32126633/article/details/79535608