제출 #1160431

#제출 시각아이디문제언어결과실행 시간메모리
1160431fryingducCake 3 (JOI19_cake3)C++20
0 / 100
0 ms328 KiB
#include "bits/stdc++.h"

using namespace std;

#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif

const int maxn = 2e5 + 5;
int n, m, v[maxn], c[maxn];
int ord[maxn];

void solve() {
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) {
    cin >> v[i] >> c[i];
    ord[i] = i;
  }
  sort(ord + 1, ord + n + 1, [](const int &x, const int &y) -> bool {
    return c[x] < c[y];
  });
  set<pair<long long, int>> s;
  long long sum = 0;
  int cur_mn = 1;
  set<int> cand;
  for (int i = 1; i < m; ++i) {
    if (i == 1) {
      s.insert(make_pair(1ll * v[ord[i]] + 2 * c[ord[i]], i));
    } else {
      s.insert(make_pair(v[ord[i]], i));
    }
    cand.insert(i);
  }
  for (auto i:s) {
    sum += i.first;
  }
  long long res = -1e18;
  for (int i = m; i <= n; ++i) {
    res = max(res, sum + v[ord[i]] - 2 * c[ord[i]]);
    if (v[ord[i]] >= s.begin()->first) {
      auto t = *s.begin();
      s.erase(t);
      cand.erase(t.second);
      sum -= t.first;
      sum += v[ord[i]];
      s.insert(make_pair(v[ord[i]], i));
      cand.insert(i);
      if (t.second == cur_mn) {
        cur_mn = *cand.begin();
        s.erase(s.find(make_pair(v[ord[cur_mn]], cur_mn)));
        s.insert(make_pair(1ll * v[ord[cur_mn]] + 2ll * c[ord[cur_mn]], cur_mn));
        sum += 2ll * c[ord[cur_mn]];
      }
    }
  }
  cout << res;
}

signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  solve();

  return 0;
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...