Submission #1210154

#TimeUsernameProblemLanguageResultExecution timeMemory
1210154dima2101Bitaro's travel (JOI23_travel)C++20
5 / 100
3097 ms6680 KiB
#include <bits/stdc++.h>
#define int long long

signed main()
{
    int n;
    std::cin >> n;

    std::vector<int> x(n);
    for (int i = 0; i < n; i++)
    {
        std::cin >> x[i];
    }

    std::vector<int> prev(n);
    for (int i = 0; i < n; i++)
    {
        if (i == n - 1)
        {
            prev[i] = 0;
            continue;
        }
        int last = 0;
        for (int j = i; j >= 1; j--)
        {
            if (x[i + 1] - x[j] < x[j] - x[j - 1])
            {
                last = j;
                break;
            }
        }
        // std::cout << i << ' ' << last << std::endl;
        prev[i] = last;
    }

    std::vector<int> next(n);
    for (int i = 0; i < n; i++)
    {
        if (i == 0)
        {
            next[i] = n - 1;
            continue;
        }
        int last = n - 1;
        for (int j = i; j < n - 1; j++)
        {
            if (x[j] - x[i - 1] <= x[j + 1] - x[j])
            {
                last = j;
                break;
            }
        }
        //  std::cout << i << ' ' << next[i] << ' ' << last << std::endl;
        next[i] = last;
    }
    // exit(0);

    std::vector<int> ans(n);
    for (int i = 0; i < n; i++)
    {
        int l = i, r = i;
        int j = i;
        while ((r - l + 1) != n)
        {
            //'std::cout << l << ' ' << r << ' ' << j << ' ' << next[j] << ' ' << prev[j] << std::endl;
            if (next[j] != j)
            {
                r = next[j];
                ans[i] += x[r] - x[j];
                j = r;
            }
            else
            {

                l = prev[j];

                ans[i] += x[j] - x[l];
                j = l;
            }
        }
    }

    int q;
    std::cin >> q;

    for (int i = 0; i < q; i++)
    {
        int now;
        std::cin >> now;

        // if (n == 1)
        // {
        //     std::cout << std::abs(x[0] - now) << std::endl;
        //     ;
        //     continue;
        // }

        int l = 0, r = x.size();
        while (l + 1 < r)
        {
            int mid = (l + r) / 2;
            if (x[mid] <= now)
            {
                l = mid;
            }
            else
            {
                r = mid;
            }
        }
        int cur = 0;
        int now_ind = -1;
        if (r == x.size())
        {
            cur += std::abs(now - x.back());
            now_ind = l;
        }
        else
        {
            if (std::abs(x[l] - now) <= std::abs(x[r] - now))
            {
                now_ind = l;
                cur += std::abs(x[l] - now);
            }
            else
            {
                now_ind = r;
                cur += std::abs(x[r] - now);
            }
        }
        std::cout << ans[now_ind] + cur << std::endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...