제출 #1175156

#제출 시각아이디문제언어결과실행 시간메모리
1175156chikien2009Snowball (JOI21_ho_t2)C++20
100 / 100
75 ms8880 KiB
#include <bits/stdc++.h>

using namespace std;

void setup()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

int n, q, a, b;
long long w, change;
long long maxchange, minchange, dist;
long long x[200000], weight[200000];
priority_queue<pair<long long, pair<int, int>>> pq;
bool lock_left[200000], lock_right[200000];

int main()
{
    setup();

    cin >> n >> q;
    for (int i = 0; i < n; ++i)
    {
        cin >> x[i];
        if (0 < i)
        {
            pq.push({-(x[i] - x[i - 1]), {i - 1, i}});
        }
    }
    for (int i = 0; i < q; ++i)
    {
        cin >> w;
        change += w;
        minchange = min(minchange, change);
        maxchange = max(maxchange, change);
        while (!pq.empty() && maxchange - minchange >= -pq.top().first)
        {
            dist = -pq.top().first;
            a = pq.top().second.first;
            b = pq.top().second.second;
            pq.pop();
            if (w > 0)
            {
                weight[a] += dist + minchange;
                weight[b] -= minchange;
                lock_right[a] = lock_left[b] = true;
            }
            else
            {
                weight[a] += maxchange;
                weight[b] += dist - maxchange;
                lock_right[a] = lock_left[b] = true;
            }
        }
    }
    for (int i = 0; i < n; ++i)
    {
        cout << weight[i] + (!lock_right[i]) * maxchange - (!lock_left[i]) * minchange << "\n";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...