Submission #1280878

#TimeUsernameProblemLanguageResultExecution timeMemory
1280878tvgkBitaro's travel (JOI23_travel)C++20
5 / 100
18 ms4008 KiB
#include<bits/stdc++.h>
using namespace std;
#define task "a"
#define ll long long
#define fi first
#define se second
#define ii pair<ll, ll>
const int mxN = 1e5 + 7, inf = 1e9 + 7;

int n, lt[mxN * 4], rt[mxN * 4], a[mxN];

void Build(int j = 1, int l = 1, int r = n)
{
    if (l == r)
    {
        lt[j] = 2 * a[l] - a[l - 1];
        rt[j] = 2 * a[l] - a[l + 1];
        return;
    }

    int mid = (l + r) / 2;
    Build(j * 2, l, mid);
    Build(j * 2 + 1, mid + 1, r);
    lt[j] = max(lt[j * 2], lt[j * 2 + 1]);
    rt[j] = min(rt[j * 2], rt[j * 2 + 1]);
}

void RWalk(int u, int vt, int& res, int j = 1, int l = 1, int r = n)
{
    if (r < vt || res)
        return;

    if (vt <= l && a[u] < rt[j])
        return;

    if (l == r)
    {
        res = l;
        return;
    }

    int mid = (l + r) / 2;
    RWalk(u, vt, res, j * 2, l, mid);
    RWalk(u, vt, res, j * 2 + 1, mid + 1, r);
}

void LWalk(int v, int vt, int& res, int j = 1, int l = 1, int r = n)
{
    if (vt < l || res)
        return;

    if (r <= vt && lt[j] <= a[v])
        return;

    if (l == r)
    {
        res = l;
        return;
    }

    int mid = (l + r) / 2;
    LWalk(v, vt, res, j * 2 + 1, mid + 1, r);
    LWalk(v, vt, res, j * 2, l, mid);
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie();
    cout.tie();
    //freopen(task".INP", "r", stdin);
    //freopen(task".OUT", "w", stdout);

    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    a[0] = -inf;
    a[n + 1] = 2 * inf;
    Build();

    int q;
    cin >> q;
    for (int i = 1; i <= q; i++)
    {
        int vt;
        cin >> vt;

        ll ans = 0;
        int v = lower_bound(a, a + n + 2, vt) - a;
        int u = v - 1;
        if (a[v] - vt < vt - a[u])
        {
            ans += a[v] - vt;
            vt = v++;
        }
        else
        {
            ans += vt - a[u];
            vt = u--;
        }

        while (1 <= u || v <= n)
        {
            if (v - vt == 1)
            {
                int res = 0;
                RWalk(u, vt, res);
                if (!res)
                    res = n;

                ans += a[res] - a[vt];
                if (u)
                {
                    ans += a[res] - a[u];
                    vt = u;
                    u--;
                }
                v = res + 1;
            }
            else
            {
                int res = 0;
                LWalk(v, vt, res);
                if (res == 0)
                    res = 1;

                ans += a[vt] - a[res];
                if (v <= n)
                {
                    ans += a[v] - a[res];
                    vt = v;
                    v++;
                }
                u = res - 1;
            }
        }
        cout << ans << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...