Submission #1147167

#TimeUsernameProblemLanguageResultExecution timeMemory
1147167Mike_VuCake 3 (JOI19_cake3)C++17
0 / 100
1 ms328 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double dou; #define pii pair<int, int> #define fi first #define se second #define pb push_back #define BITj(x, j) (((x)>>(j))&1) #define MASK(x) (1LL<<(x)) template<typename T> bool maximize(T &x, const T &y) { if (x < y) {x = y; return 1;} return 0; } template<typename T> bool minimize(T &x, const T &y) { if (x > y) {x = y; return 1;} return 0; } const int maxn = 2e5+5; int n, m; pii a[maxn]; ll ans = 0; void input() { cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> a[i].se >> a[i].fi; } } namespace sub3{ multiset<int> st1, st2; ll cursum = 0; void insval(int x) { // cout << "insval " << x << "\n"; st1.insert(x); cursum += x; while ((int)st1.size() > m) { int val = *st1.begin(); st1.erase(st1.begin()); cursum -= val; st2.insert(val); } } void remval(int x) { // cout << "remval " << x << "\n"; auto it = st1.find(x); if (it == st1.end()) st2.erase(st2.find(x)); else { st1.erase(it); cursum -= x; } while ((int)st1.size() < m && !st2.empty()) { it = prev(st2.end()); int val = *it; st2.erase(it); st1.insert(val); cursum += val; } } void dnc(int l, int r, int opl, int opr) { //find best, minimize ans // cout << "begin " << l << ' ' << r << "\n"; int opt = opr, mid = (l+r)>>1; ll best = -1; for (int i = max(mid, opl); i <= opr; i++) { insval(a[i].se); ll val = cursum - 2LL*(a[i].fi-a[mid].fi); if ((int)st1.size() == m && maximize(best, val)) { opt = i; } } // cout << l << ' ' << r << ' ' << opl << ' ' << opr << ' ' << mid << ": " << opt << ' ' << best << "\n"; maximize(ans, best); //clear & continue int nxtmid; if (l < mid) { nxtmid = (l+mid-1)>>1; for (int i = max(mid, opl); i <= opr; i++) { remval(a[i].se); } for (int i = nxtmid; i < min(opl, mid); i++) { insval(a[i].se); } dnc(l, mid-1, opl, opt); for (int i = max(mid, opl); i <= opr; i++) { insval(a[i].se); } for (int i = nxtmid; i < min(opl, mid); i++) { remval(a[i].se); } } if (mid < r) { nxtmid = (r+mid+1)>>1; for (int i = mid; i < nxtmid; i++) { remval(a[i].se); } for (int i = max(nxtmid, opt); i <= opr; i++) { remval(a[i].se); } dnc(mid+1, r, opt, opr); for (int i = mid; i < nxtmid; i++) { insval(a[i].se); } for (int i = max(nxtmid, opt); i <= opr; i++) { insval(a[i].se); } } //clear & return for (int i = max(mid, opl); i <= opr; i++) { remval(a[i].se); } // cout << "end " << l << ' ' << r << "\n"; } void solve() { sort(a+1, a+n+1); dnc(1, n, 1, n); cout << ans; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); // #define name "task" // if (fopen(name".inp", "r")) { // freopen(name".inp", "r", stdin); // freopen(name".out", "w", stdout); // } input(); return sub3::solve(), 0; } /* 5 3 2 1 4 2 6 4 8 8 10 16 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...