Submission #1037094

#TimeUsernameProblemLanguageResultExecution timeMemory
1037094juicyCake 3 (JOI19_cake3)C++17
100 / 100
984 ms15668 KiB
#include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "debug.h" #else #define debug(...) 42 #endif const int N = 2e5 + 5; const long long inf = 1e18; int n, m, sz; int cnt[4 * N]; long long s[4 * N]; array<int, 2> a[N]; vector<int> comp; void upd(int i, int x, int id = 1, int l = 1, int r = sz) { if (l == r) { s[id] += x; cnt[id] += x > 0 ? 1 : -1; return; } int md = (l + r) / 2; if (i <= md) { upd(i, x, id * 2, l, md); } else { upd(i, x, id * 2 + 1, md + 1, r); } s[id] = s[id * 2] + s[id * 2 + 1]; cnt[id] = cnt[id * 2] + cnt[id * 2 + 1]; } long long qry(int k, int id = 1, int l = 1, int r = sz) { if (l == r) { long long value = s[id] / cnt[id]; return value * k; } int md = (l + r) / 2; if (k > cnt[id * 2 + 1]) { return qry(k - cnt[id * 2 + 1], id * 2, l, md) + s[id * 2 + 1]; } return qry(k, id * 2 + 1, md + 1, r); } void add(int i, int x) { upd(a[i][0], x * comp[a[i][0] - 1]); } int L = 1, R = 0; void shift(int a, int b) { while (R < b) { add(++R, 1); } while (L > a) { add(--L, 1); } while (R > b) { add(R--, -1); } while (L < a) { add(L++, -1); } } long long res = -inf; void dc(int l, int r, int tl, int tr) { if (l > r) { return; } int md = (l + r) / 2; pair<long long, int> best = {-inf, -1}; for (int i = tl; i <= min(tr, md - m + 1); ++i) { shift(i, md); best = max(best, {qry(m) - (long long) 2 * (a[md][1] - a[i][1]), i}); } res = max(res, best.first); dc(l, md - 1, tl, best.second); dc(md + 1, r, best.second, tr); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; for (int i = 1; i <= n; ++i) { cin >> a[i][0] >> a[i][1]; comp.push_back(a[i][0]); } sort(a + 1, a + n + 1, [&](auto u, auto v) { return u[1] < v[1]; }); sort(comp.begin(), comp.end()); comp.erase(unique(comp.begin(), comp.end()), comp.end()); sz = comp.size(); for (int i = 1; i <= n; ++i) { a[i][0] = lower_bound(comp.begin(), comp.end(), a[i][0]) - comp.begin() + 1; } dc(m, n, 1, n - m + 1); cout << res; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...