Submission #1210158

#TimeUsernameProblemLanguageResultExecution timeMemory
1210158dima2101Bitaro's travel (JOI23_travel)C++20
100 / 100
267 ms8800 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); std::vector<std::pair<int, int>> now; now.push_back({1e13, 0}); for (int i = 0; i < n; i++) { if (i == n - 1) { prev[i] = 0; continue; } if (i != 0) { int tmp = 2 * x[i] - x[i - 1]; while (now.size() > 0 && now.back().first <= tmp) { now.pop_back(); } now.push_back({tmp, i}); } int l = 0, r = now.size(); while (l + 1 < r) { int mid = (l + r) / 2; if (x[i + 1] < now[mid].first) { l = mid; } else { r = mid; } } // std::cout << i << ' ' << prev[i] << std::endl; // for (auto j : now) // { // std::cout << j.first << ' ' << j.second << std::endl; // } prev[i] = now[l].second; } std::vector<int> next(n); now.clear(); now.push_back({-1e13, n - 1}); for (int i = n - 1; i >= 0; i--) { if (i == 0) { next[i] = n - 1; continue; } if (i != n - 1) { int tmp = 2 * x[i] - x[i + 1]; while (now.size() > 0 && now.back().first >= tmp) { now.pop_back(); } now.push_back({tmp, i}); } int l = 0, r = now.size(); while (l + 1 < r) { int mid = (l + r) / 2; if (now[mid].first <= x[i - 1]) { l = mid; } else { r = mid; } } // std::cout << i << ' ' << next[i] << ' ' << last << std::endl; next[i] = now[l].second; } // 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...