Submission #920397

#TimeUsernameProblemLanguageResultExecution timeMemory
920397borisAngelovSnowball (JOI21_ho_t2)C++17
100 / 100
81 ms17084 KiB
#include <bits/stdc++.h>

using namespace std;

const int maxn = 200005;

int n, m;

long long a[maxn];
long long b[maxn];

long long maxDeltaL[maxn];
long long maxDeltaR[maxn];

long long maxLeft[maxn];
long long maxRight[maxn];

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

int main()
{
    fastIO();

    cin >> n >> m;

    for (int i = 1; i <= n; ++i)
    {
        cin >> a[i];
    }

    for (int i = 1; i <= m; ++i)
    {
        cin >> b[i];
    }

    long long currDelta = 0;

    for (int i = 1; i <= m; ++i)
    {
        currDelta += b[i];
        maxDeltaL[i] = min(maxDeltaL[i - 1], currDelta);
        maxDeltaR[i] = max(maxDeltaR[i - 1], currDelta);
    }

    maxLeft[1] = a[1] + maxDeltaL[m];
    maxRight[n] = a[n] + maxDeltaR[m];

    for (int i = 1; i <= n - 1; ++i)
    {
        // min time to intersect

        int l = 1;
        int r = m;

        while (l <= r)
        {
            int mid = (l + r) / 2;

            if (a[i] + maxDeltaR[mid] <= a[i + 1] + maxDeltaL[mid])
            {
                l = mid + 1;
            }
            else
            {
                r = mid - 1;
            }
        }

        maxRight[i] = a[i] + maxDeltaR[r];
        maxLeft[i + 1] = a[i + 1] + maxDeltaL[r];

        if (l <= m)
        {
            //decides who will get the snow

            if (b[l] < 0)
            {
                maxLeft[i + 1] = maxRight[i];
            }
            else
            {
                maxRight[i] = maxLeft[i + 1];
            }
        }
    }

    for (int i = 1; i <= n; ++i)
    {
        cout << maxRight[i] - maxLeft[i] << "\n";
    }

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