제출 #1230611

#제출 시각아이디문제언어결과실행 시간메모리
1230611biankSnowball (JOI21_ho_t2)C++20
100 / 100
1351 ms6888 KiB
#include <bits/stdc++.h> using namespace std; #define forsn(i, s, n) for (int i = int(s); i < int(n); i++) #define forn(i, n) forsn(i, 0, n) #define dforsn(i, s, n) for (int i = int(n) - 1; i >= int(s); i--) #define dforn(i, n) dforsn(i, 0, n) #define sz(x) int(x.size()) #define all(x) begin(x), end(x) using ll = long long; using ld = long double; using vi = vector<int>; using vb = vector<bool>; using vll = vector<ll>; using ii = pair<int, int>; using iii = tuple<int, int, int>; #define fst first #define snd second #define pb push_back #define eb emplace_back const ll INF = 1e18; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, q; cin >> n >> q; vll x(n); forn(i, n) cin >> x[i]; vll minDiff(q + 1, 0), maxDiff(q + 1, 0); ll currDiff = 0; forn(i, q) { ll w; cin >> w; currDiff += w; minDiff[i + 1] = max(minDiff[i], -currDiff); maxDiff[i + 1] = max(maxDiff[i], currDiff); } auto time = [&](int idx, ll b) { if (idx < 0 || idx >= n) return q + 2; ll a = x[idx]; if (a <= b) return int(lower_bound(all(maxDiff), b - a) - begin(maxDiff)); return int(lower_bound(all(minDiff), a - b) - begin(minDiff)); }; forn(i, n) { ll lo = x[i] - minDiff[q] - 1, hi = x[i]; while (hi - lo > 1) { ll mid = (lo + hi) / 2; if (time(i, mid) < time(i - 1, mid + 1)) hi = mid; else lo = mid; } ll ret = x[i] - hi; lo = x[i], hi = x[i] + maxDiff[q] + 1; while (hi - lo > 1) { ll mid = (lo + hi) / 2; if (time(i, mid) < time(i + 1, mid - 1)) lo = mid; else hi = mid; } ret += lo - x[i]; cout << ret << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...