CodeForces - 948C(前缀和 + 二分)

链接:CodeForces - 948C

题意:N天,每天生产一堆雪体积 V[i] ,每天每堆雪融化 T[i],问每天融化了多少雪。

题解:对 T 求前缀和,求每一堆雪能熬过多少天,再记录一下多余的就行了。

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10;
int N;
int V[maxn], T[maxn];
long long S[maxn], E[maxn], D[maxn], X[maxn];

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]);

    for(int i = 1; i <= N; i++) S[i] = S[i - 1] + T[i];
    for(int i = 1; i <= N; i++){
        int l = i, r = N;
        while(l <= r){
            int m = (l + r) >> 1;
            if(V[i] >= S[m] - S[i - 1]) l = m + 1;
            else r = m - 1;
        }

        E[i]++; E[l]--;
        D[l] += V[i] - (S[r] - S[i - 1]);
    }
    for(int i = 1; i <= N; i++) X[i] = X[i - 1] + E[i];

    for(int i = 1; i <= N; i++) printf("%lld%c", X[i] * T[i] + D[i], i == N ? '\n' : ' ');

    return 0;
}

 

posted @ 2018-08-14 20:26  鬼沐冢  阅读(345)  评论(0编辑  收藏  举报