제출 #1310846

#제출 시각아이디문제언어결과실행 시간메모리
1310846samarthkulkarniSnowball (JOI21_ho_t2)C++20
100 / 100
672 ms9972 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define vi vector<long long> #define all(x) x.begin(), x.end() #define endl "\n" void solution(); int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); solution(); return 0; } const int N = 2e5+10; ll a[N]; ll qw[N]; ll res[N]; ll mx[N], mn[N]; void solution() { ll n, q; cin >> n >> q; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 0; i < q; i++) cin >> qw[i]; mx[0] = max(0ll, qw[0]); mn[0] = min(0ll, qw[0]); for (int i = 1; i < q; i++) { qw[i] += qw[i-1]; mx[i] = max(mx[i-1], qw[i]); mn[i] = min(mn[i-1], qw[i]); } if (n == 1) { cout << abs(mn[q-1]) + mx[q-1] << endl; return; } auto right = [&](int i, ll x) { if (x > mx[q-1]) return false; int l = 0, r = q-1; while (l <= r) { int mid = (l + r)/2; if (mx[mid] < x) l = mid+1; else { if (a[i] + x <= a[i+1] + mn[mid]) return true; r = mid-1; } } return false; }; auto left = [&](int i, ll x) { if (x > abs(mn[q-1])) return false; int l = 0, r = q-1; while (l <= r) { int mid = (l + r)/2; if (-mn[mid] < x) l = mid+1; else { if (a[i]-x >= a[i-1] + mx[mid]) return true; r = mid-1; } } return false; }; auto calculate = [&](int i, bool t) { ll l = 0, r = 1e13; ll w = 0; while (l <= r) { ll mid = (l + r)/2; if (t) { if (right(i, mid)) { w = mid; l = mid+1; } else r = mid-1; } else { if (left(i, mid)) { w = mid; l = mid+1; } else r = mid-1; } } return w; }; for (int i = 2; i < n; i++) { res[i] = calculate(i, 1) + calculate(i, 0); } res[1] = calculate(1, 1) -mn[q-1]; res[n] = calculate(n, 0) + mx[q-1]; for (int i = 1; i <= n; i++) cout << res[i] << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...