제출 #1010126

#제출 시각아이디문제언어결과실행 시간메모리
1010126tvladm2009Measures (CEOI22_measures)C++17
100 / 100
290 ms54704 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define int ll const int N = 2e5 + 7; const int INF = 1e16; int n, m, d; int a[2 * N], b[2 * N]; struct Node { ll mn; ll mx; ll diff; Node() { mn = INF; mx = -INF; diff = 0; } }; Node operator + (Node a, Node b) { Node c; c.mn = min(a.mn, b.mn); c.mx = max(a.mx, b.mx); c.diff = max(a.diff, b.diff); c.diff = max(c.diff, b.mx - a.mn); return c; } Node tree[8 * N]; pair<ll, ll> lazy[8 * N]; void push(int v, int tl, int tr) { if (tl < tr) { lazy[2 * v].first += lazy[v].first; lazy[2 * v].second += lazy[v].second; lazy[2 * v + 1].first += lazy[v].first; lazy[2 * v + 1].second += lazy[v].second; } tree[v].mn += lazy[v].first; tree[v].mx += lazy[v].second; lazy[v] = {0, 0}; } void add(int v, int tl, int tr, int l, int r, ll x, ll y) { push(v, tl, tr); if (l > tr || r < tl) { return; } if (l <= tl && tr <= r) { lazy[v].first += x; lazy[v].second += y; push(v, tl, tr); return; } int tm = (tl + tr) / 2; add(2 * v, tl, tm, l, r, x, y); add(2 * v + 1, tm + 1, tr, l, r, x, y); tree[v] = tree[2 * v] + tree[2 * v + 1]; } Node get(int v, int tl, int tr, int l, int r) { push(v, tl, tr); if (l <= tl && tr <= r) { return tree[v]; } int tm = (tl + tr) / 2; if (l <= tm && r <= tm) { return get(2 * v, tl, tm, l, r); } else if (tm + 1 <= l && tm + 1 <= r) { return get(2 * v + 1, tm + 1, tr, l, r); } else { return get(2 * v, tl, tm, l, tm) + get(2 * v + 1, tm + 1, tr, tm + 1, r); } } ll ans = 0; void baga(int i) { add(1, 1, n + m, b[i], b[i], -(INF + a[i]), INF - a[i]); add(1, 1, n + m, b[i], n + m, d, d); ans = get(1, 1, n + m, 1, n + m).diff; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> m >> d; for (int i = 1; i <= n; ++i) { cin >> a[i]; } for (int i = 1; i <= m; ++i) { cin >> a[i + n]; } { vector<pair<int, int>> v; for (int i = 1; i <= n + m; ++i) v.push_back({a[i], i}); sort(v.begin(), v.end()); for (int i = 0; i < n + m; ++i) b[v[i].second] = i + 1; } for (int i = 1; i <= n; ++i) { baga(i); } for (int i = 1; i <= m; ++i) { baga(i + n); cout << ans / 2; if (ans % 2 == 1) cout << ".5"; cout << " "; } 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...