제출 #792453

#제출 시각아이디문제언어결과실행 시간메모리
792453vjudge1Bitaro's travel (JOI23_travel)C++17
15 / 100
3078 ms36692 KiB
#include <bits/stdc++.h>

#define fi first
#define se second

const int N = 200200;

using namespace std;

int n;
long long a[N];
long long t[N][20];
long long L[N];

long long get(int l, int r)
{
    int g = L[r - l + 1];
    return max(t[l][g], t[r - (1 << g) + 1][g]);
}

long long go_one(int &l, int&r, int &k)
{
    if (l == 1 && r == n) {
        return 0;
    }
    long long res;
    if (abs(a[k] - a[l - 1]) <= abs(a[k] - a[r + 1])) {
        l--;
        res = abs(a[k] - a[l]);
        k = l;
    } else {
        r++;
        res = abs(a[k] - a[r]);
        k = r;
    }
    return res;
}

long long solve(int k)
{
    int l = k, r = k;
    long long res = go_one(l, r, k);
    while (l > 1 || r < n) {

        res += go_one(l, r, k);
    }
    return res;
}

int main()
{
    #ifdef zxc
        freopen("input.txt", "r", stdin);
        freopen("output.txt", "w", stdout);
    #endif
    ios_base::sync_with_stdio(0);

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

    for (int i = 1; i <= n; i++) {
        t[i][0] = a[i + 1] - a[i];
    }
    for (int i = 2; i < N; i++) {
        L[i] = L[i / 2] + 1;
    }
    for (int i = 1; i < 20; i++) {
        for (int j = 1; j + (1 << i) - 1 <= n; j++) {
            t[j][i] = max(t[j][i - 1], t[j + (1 << i)][i - 1]);
        }
    }

    int q;
    cin >> q;
    while (q--) {
        long long x;
        cin >> x;
        int i = lower_bound(a + 1, a + n + 1, x) - a;
        if (i > 1 && abs(a[i - 1] - x) <= abs(a[i] - x)) {
            i--;
        }

        cout << solve(i) + abs(a[i] - x) << "\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...