제출 #1274773

#제출 시각아이디문제언어결과실행 시간메모리
1274773MisterReaperSnowball (JOI21_ho_t2)C++20
100 / 100
67 ms11476 KiB
// File snowball.cpp created on 30.09.2025 at 19:27:47
#include <bits/stdc++.h>

using i64 = long long;

#ifdef DEBUG 
    #include "/home/ahmetalp/Desktop/Workplace/debug.h"
#else
    #define debug(...) void(23)
#endif

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int N, Q;
    std::cin >> N >> Q;

    std::vector<i64> X(N);
    for (int i = 0; i < N; ++i) {
        std::cin >> X[i];
    }

    std::vector<i64> W(Q + 1);
    for (int i = 1; i <= Q; ++i) {
        std::cin >> W[i];
    }

    for (int i = 1; i <= Q; ++i) {
        W[i] += W[i - 1];
    }

    std::vector<i64> minW(Q + 1), maxW(Q + 1), sum(Q + 1);
    for (int i = 1; i <= Q; ++i) {
        minW[i] = std::min(minW[i - 1], W[i]);
        maxW[i] = std::max(maxW[i - 1], W[i]);
        sum[i] = std::max(sum[i - 1], -minW[i] + maxW[i]);
    }

    std::vector<i64> ans(N);

    ans[0] += -minW[Q];
    ans[N - 1] += maxW[Q];

    for (int i = 0; i + 1 < N; ++i) {
        i64 d = X[i + 1] - X[i];
        if (d >= sum[Q]) {
            ans[i] += maxW[Q];
            ans[i + 1] += -minW[Q];
        } else {
            int j = int(std::lower_bound(sum.begin(), sum.end(), d) - sum.begin() - 1);
            ans[i] += maxW[j];
            ans[i + 1] += -minW[j];
            if (W[j + 1] > W[j]) {
                ans[i] += d - (maxW[j] - minW[j]);
            } else {
                ans[i + 1] += d - (maxW[j] - minW[j]);
            }
        }
    }

    for (int i = 0; i < N; ++i) {
        std::cout << ans[i] << '\n';
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...