Submission #1147318

#TimeUsernameProblemLanguageResultExecution timeMemory
1147318Mike_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 ALL(v) v.begin(), v.end() #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 = LLONG_MIN; void input() { cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> a[i].se >> a[i].fi; } } namespace sub3{ struct SMT{ int trsz; vector<ll> tr; vector<int> cnt; void init(int n) { trsz = 1; while (trsz < n) trsz <<= 1; tr.assign(trsz<<1, 0); cnt.assign(trsz<<1, 0); } void update(int k, int x, int c) { k += trsz-1; while (k > 0) { tr[k] += x*c; cnt[k] += c; k >>= 1; } } ll walk(int id, int &target) { if (target >= cnt[id]) { target -= cnt[id]; return tr[id]; } if (id >= trsz) { return 0; } ll sum = walk(id<<1|1, target); if (target > 0) { sum += walk(id<<1, target); } return sum; } ll query() { int temp = m; return walk(1, temp); } }; vector<int> values; SMT tr; void discretize() { sort(ALL(values)); values.erase(unique(ALL(values)), values.end()); } int fval(int x) { return lower_bound(ALL(values), x)-values.begin()+1; } void insval(int x) { int cor = fval(x); tr.update(cor, x, 1); } void remval(int x) { int cor = fval(x); tr.update(cor, x, -1); } void dnc(int l, int r, int opl, int opr) { //find best, minimize ans // cout << "begin " << l << ' ' << r << "\n"; int opt = -1, mid = (l+r)>>1; ll best = LLONG_MIN; for (int i = max(mid, opl); i <= opr; i++) { insval(a[i].se); ll val = tr.query() - 2LL*(a[i].fi-a[mid].fi); if (mid+m-1 <= i && maximize(best, val)) { opt = i; } } 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); for (int i= 1; i <= n; i++) { values.pb(a[i].se); } discretize(); tr.init((int)values.size()); dnc(1, n-m+1, 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 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; } if (!st2.empty() && (int)st1.size() < m) { it = prev(st2.end()); int val = *it; st2.erase(it); st1.insert(val); cursum += val; } } */

Compilation message (stderr)

cake3.cpp: In function 'int main()':
cake3.cpp:160:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  160 |         freopen(name".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
cake3.cpp:161:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  161 |         freopen(name".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...