Skip to content

14236: 【原4236】Tubes

题目

题目描述

author: Pikachu 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/4236

题目内容

小Z的同学要做许多实验,某个实验需要\(n\)个试管。她在第\(i\)个小时往第\(i\)个试管里面有\(V_i\)微升液体。而第\(j\)小时,每个试管都会蒸发\(R_j\)微升该液体直到试管全空。请问每一个小时所有试管总共蒸发了多少液体?

输入格式

第一行一个整数\(n\)。
第二行\(n\)个整数,代表\(n\)个试管中的液体体积\(V_i\)。
第三行\(n\)个整数,代表\(n\)个小时中蒸发液体体积\(R_j\)。

输出格式

输出一行\(n\)个整数,第\(i\)个整数代表第\(i\)个小时所有试管中蒸发的溶液总体积。

样例输入1

3
10 10 5
5 7 2

样例输出1

5 12 4

样例解释

第一个小时同学向试管1中加入了10ul的液体,同时要蒸发5ul,剩余3个试管的液体体积为5ul(-5ul),0ul,0ul。这一个小时蒸发了5ul。
第二个小时同学向试管2中加入了10ul的液体,每个试管要蒸发7ul,因此剩余3个试管的液体体积为0ul(-5ul,因为只剩下5ul。),3ul(-7ul),0ul。这一个小时蒸发了12ul。
第三个小时同学向试管3中加入了5ul的液体,每个试管要蒸发2ul,因此剩余3个试管的液体体积为0ul,1ul(-2ul),3ul(-2ul)。这一个小时蒸发了4ul。

温馨提醒

中间结果大概率会超过int,注意使用long long。

数据规模

对于100%的数据,\(1 \leq n \leq 10^5\),\(0 \leq V_i \leq 10^9\),\(0 \leq R_j \leq 10^9\)。

zqy2018's solution

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, v[100005], r[100005], cnt[100005] = {0};
ll sum[100005], res[100005] = {0};
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", &r[i]), sum[i] = sum[i - 1] + 1ll * r[i];
    for (int i = 1; i <= n; ++i){
        int dd = upper_bound(sum + 1, sum + n + 1, sum[i - 1] + v[i]) - sum;
        cnt[i]++, cnt[dd]--;
        res[dd] += (1ll * v[i] - sum[dd - 1] + sum[i - 1]);
    }
    int ss = 0;
    for (int i = 1; i < n; ++i){
        ss += cnt[i];
        printf("%lld ", 1ll * ss * r[i] + res[i]);
    }
    ss += cnt[n];
    printf("%lld\n", 1ll * ss * r[n] + res[n]);
    return 0;
}