제출 #1340895

#제출 시각아이디문제언어결과실행 시간메모리
1340895ramzialoulouPalembang Bridges (APIO15_bridge)C++20
100 / 100
56 ms4284 KiB
#include <bits/stdc++.h>
 
using namespace std;

const int inf = int(2e9);
int64_t rs, ls;
priority_queue<int> lpq, rpq;

void insert(int x) {
  int median = (lpq.empty() ? inf : lpq.top());
  if (x <= median) {
    lpq.push(x);
    ls += x;
  } else {
    rpq.push(-x);
    rs += x;
  }
  if (lpq.size() > rpq.size() + 1) {
    int m = lpq.top();
    lpq.pop();
    ls -= m;
    rpq.push(-m);
    rs += m;
  } else if (rpq.size() > lpq.size()) {
    int m = -rpq.top();
    rpq.pop();
    rs -= m;
    lpq.push(m);
    ls += m;
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int k, n;
  cin >> k >> n;
  vector<pair<int, int>> segs;
  int64_t same = 0;
  for (int i = 0; i < n; i++) {
    char p;
    cin >> p;
    int s;
    cin >> s;
    char q;
    cin >> q;
    int t;
    cin >> t;
    int l = min(s, t);
    int r = max(s, t);
    if (p != q) {
      same++;
      segs.emplace_back(l, r);
    } else {
      same += r - l;
    }
  }
  n = int(segs.size());
  sort(segs.begin(), segs.end(), [&](auto& a, auto& b) {
    return (a.first + a.second < b.first + b.second);
  });
  vector<int64_t> pref(n + 1);
  for (int i = 0; i < n; i++) {
    insert(segs[i].first);
    insert(segs[i].second);
    pref[i + 1] = rs - ls;
  }
  int64_t ans = pref[n];
  if (k == 2) {
    ls = rs = 0;
    while (!lpq.empty()) {
      lpq.pop();
    }
    while (!rpq.empty()) {
      rpq.pop();
    }
    vector<int64_t> suf(n + 1);
    for (int i = n - 1; i >= 0; i--) {
      insert(segs[i].first);
      insert(segs[i].second);
      suf[i + 1] = rs - ls;
    }
    for (int i = 0; i < n; i++) {
      ans = min(ans, pref[i] + suf[i + 1]);
    }
  }
  cout << ans + same << '\n';
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...