제출 #1243574

#제출 시각아이디문제언어결과실행 시간메모리
1243574sinatbtfardMeasures (CEOI22_measures)C++20
35 / 100
330 ms86648 KiB
#include <bits/stdc++.h> #define int long long using namespace std; const int maxn = 5e5 + 10, inf = 1e17; struct segment { int mn[maxn << 2], mx[maxn << 2], lazy[maxn << 2]; int ans[maxn << 2]; segment (){ for (int i = 0; i < (maxn << 2); i++) mn[i] = inf, mx[i] = -inf, lazy[i] = 0, ans[i] = -inf; } void modify (int i, int x){ mn[i] += x; mx[i] += x; ans[i] += x; lazy[i] += x; } void shift (int i){ modify(i << 1, lazy[i]); modify((i << 1) ^ 1, lazy[i]); lazy[i] = 0; } void point_update (int i, int L, int R, int ind, int x, int y){ if (!(R - L)){ mn[i] = mx[i] = x; ans[i] = y; return; } shift(i); int mid = (R + L) >> 1; if (ind <= mid) point_update(i << 1, L, mid, ind, x, y); else point_update((i << 1) ^ 1, mid + 1, R, ind, x, y); mn[i] = min(mn[i << 1], mn[(i << 1) ^ 1]); mx[i] = max(mx[i << 1], mx[(i << 1) ^ 1]); ans[i] = max(ans[i << 1], ans[(i << 1) ^ 1]); } void range_update (int i, int L, int R, int l, int r, int x){ if (L > r || R < l) return; if (L >= l && R <= r){ modify(i, x); return; } shift(i); int mid = (R + L) >> 1; range_update(i << 1, L, mid, l, r, x); range_update((i << 1) ^ 1, mid + 1, R, l, r, x); mn[i] = min(mn[i << 1], mn[(i << 1) ^ 1]); mx[i] = max(mx[i << 1], mx[(i << 1) ^ 1]); ans[i] = max(ans[i << 1], ans[(i << 1) ^ 1]); } int getmn (int i, int L, int R, int l, int r){ if (L > r || R < l) return inf; if (L >= l && R <= r) return mn[i]; shift(i); int mid = (R + L) >> 1; return min(getmn(i << 1, L, mid, l, r), getmn((i << 1) ^ 1, mid + 1, R, l, r)); } int getmx (int i, int L, int R, int l, int r){ if (L > r || R < l) return -inf; if (L >= l && R <= r) return mx[i]; shift(i); int mid = (R + L) >> 1; return max(getmx(i << 1, L, mid, l, r), getmx((i << 1) ^ 1, mid + 1, R, l, r)); } }seg; struct segment2 { int seg[maxn << 2]; segment2 (){ for (int i = 0; i < (maxn << 2); i++) seg[i] = 0; } void update (int i, int L, int R, int ind){ if (!(R - L)){ seg[i]++; return; } int mid = (R + L) >> 1; if (ind <= mid) update(i << 1, L, mid, ind); else update((i << 1) ^ 1, mid + 1, R, ind); seg[i] = seg[i << 1] + seg[(i << 1) ^ 1]; } int get (int i, int L, int R, int l, int r){ if (L > r || R < l) return 0; if (L >= l && R <= r) return seg[i]; int mid = (R + L) >> 1; return get(i << 1, L, mid, l, r) + get((i << 1) ^ 1, mid + 1, R, l, r); } }seg2; int n, q, d, a[maxn]; void read (){ cin >> n >> q >> d; for (int i = 0; i < n + q; i++) cin >> a[i]; } int jnd[maxn], cnt[maxn]; void compress (){ vector <int> val; for (int i = 0; i < n + q; i++) val.push_back(a[i]); sort(val.begin(), val.end()); for (int i = 0; i < n + q; i++){ jnd[i] = lower_bound(val.begin(), val.end(), a[i]) - val.begin(); cnt[jnd[i]]++; jnd[i] += cnt[jnd[i]]; } } void solve (){ compress(); for (int i = 0; i < n + q; i++){ int ind = seg2.get(1, 0, maxn - 1, 0, jnd[i]); seg2.update(1, 0, maxn - 1, jnd[i]); int x = ind * d - a[i]; seg.range_update(1, 0, maxn - 1, jnd[i] + 1, maxn - 1, d); int r0 = x - seg.getmn(1, 0, maxn - 1, 0, jnd[i] - 1); int r1 = seg.getmx(1, 0, maxn - 1, jnd[i] + 1, maxn - 1) - x; seg.point_update(1, 0, maxn - 1, jnd[i], x, max({r0, r1, 0ll})); if (i >= n){ cout << seg.ans[1] / 2; if (seg.ans[1] & 1) cout << ".5"; cout << " "; } } } int32_t main (){ ios_base::sync_with_stdio(0), cin.tie(0); read(); solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...