제출 #1266255

#제출 시각아이디문제언어결과실행 시간메모리
1266255nguynCake 3 (JOI19_cake3)C++20
0 / 100
0 ms328 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define F first #define S second #define pb push_back #define pii pair<int, int> const int N = 2e5 + 5; const int M = 5e6 + 5; const ll inf = 1e18; int n, m; pii a[N]; vector<int> cmp; struct Node { ll sum; int cnt, lef, rig; Node() {} Node(ll _sum, int _cnt, int _lef, int _rig) : sum(_sum), cnt(_cnt), lef(_lef), rig(_rig) {} } st[M]; int ver[N]; int numNode; ll res = - inf; void pull(int cur_node) { st[cur_node].cnt = st[st[cur_node].lef].cnt + st[st[cur_node].rig].cnt; st[cur_node].sum = st[st[cur_node].lef].sum + st[st[cur_node].rig].sum; } int update(int id, int l, int r, int i) { if (l == r) { st[++numNode] = Node(cmp[l - 1], 1, 0, 0); return numNode; } int mid = (l + r) / 2; int cur_id = ++numNode; if (i <= mid) { st[cur_id].lef = update(st[id].lef, l, mid, i); st[cur_id].rig = st[id].rig; pull(cur_id); } else { st[cur_id].rig = update(st[id].rig, mid + 1, r, i); st[cur_id].lef = st[id].lef; pull(cur_id); } return cur_id; } ll walk(int old_id, int id, int l, int r, int k) { if (l == r) { return 1ll * min(k, st[id].cnt - st[old_id].cnt) * cmp[l - 1]; } int mid = (l + r) / 2; int cnt_r = st[st[id].rig].cnt - st[st[old_id].rig].cnt; if (cnt_r >= k) { return walk(st[old_id].rig, st[id].rig, mid + 1, r, k); } return st[st[id].rig].sum - st[st[old_id].rig].sum + walk(st[old_id].lef, st[id].lef, l, mid, k - cnt_r); } ll cost(int l, int r) { ll ret = walk(ver[l - 1], ver[r], 1, n, m) + 2ll * (a[l].F - a[r].F) ; // cout << l << ' ' << r << ' ' << - 2ll * (a[l].F - a[r].F) << endl; return ret; } void cal(int l, int r, int optl, int optr) { if (l > r) return; int mid = (l + r) / 2; int best = optr; ll bestVal = -inf; for (int i = max(optl, mid + m - 1); i <= optr; i++) { ll cur = cost(mid, i); if (cur > bestVal) { bestVal = cur; best = i; } } res = max(res, bestVal); cal(l, mid - 1, optl, best); cal(mid + 1, r, best, optr); } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> a[i].S >> a[i].F; cmp.pb(a[i].S); } sort(a + 1, a + 1 + n); sort(cmp.begin(), cmp.end()); cmp.erase(unique(cmp.begin(), cmp.end()), cmp.end()); for (int i = 1; i <= n; i++) { // cout << a[i].F << ' ' << a[i].S << endl; int x = upper_bound(cmp.begin(), cmp.end(), a[i].S) - cmp.begin(); ver[i] = update(ver[i - 1], 1, n, x); } cal(1, n - m + 1, 1, n); cout << res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...