Submission #918939

#TimeUsernameProblemLanguageResultExecution timeMemory
918939OAleksaBitaro's travel (JOI23_travel)C++14
100 / 100
476 ms78780 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define f first #define s second const int N = 2e5 + 69; const int inf = 1e15; const int K = 18; vector<vector<int>> levo(N, vector<int>(K, inf)), desno(N, vector<int>(K, -inf)); int x[N], n, q; signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int tt = 1; //cin >> tt; while (tt--) { x[0] = -inf; cin >> n; for (int i = 1;i <= n;i++) cin >> x[i]; x[n + 1] = inf; for (int i = 1;i <= n;i++) desno[i][0] = 2 * x[i] - x[i + 1]; for (int i = 1;i <= n;i++) levo[i][0] = 2 * x[i] - x[i - 1]; for (int j = 1;j < K;j++) { for (int i = 1;i + (1 << j) <= n + 1;i++) desno[i][j] = min(desno[i][j - 1], desno[i + (1 << (j - 1))][j - 1]); } for (int j = 1;j < K;j++) { for (int i = n;i - (1 << j) >= 0;i--) levo[i][j] = max(levo[i][j - 1], levo[i - (1 << (j - 1))][j - 1]); } auto Close = [&](int s) { auto u = upper_bound(x + 1, x + n + 1, s) - x; if (abs(x[u] - s) < abs(x[u - 1] - s)) return u; return u - 1; }; cin >> q; while (q--) { int s; cin >> s; int ans = 0; int p = Close(s); ans += abs(x[p] - s); int l = p, r = p; int t = p; while (l != 1 && r != n) { int np; if (abs(x[l - 1] - x[t]) <= abs(x[r + 1] - x[t])) { //idem levo np = l; for (int i = K - 1;i >= 0;i--) { if (levo[np][i] <= x[r + 1]) { np -= (1 << i); } } l = np; ans += abs(x[np] - x[t]); t = np; } else { //idem desno np = r; for (int i = K - 1;i >= 0;i--) { if (desno[np][i] > x[l - 1]) np += (1 << i); } r = np; ans += abs(x[np] - x[t]); t = np; } } ans += x[n] - x[1]; cout << ans << '\n'; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...