제출 #617295

#제출 시각아이디문제언어결과실행 시간메모리
617295EthanKim8683Palembang Bridges (APIO15_bridge)C++17
78 / 100
353 ms15172 KiB
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <set>

using namespace std;

using I = int;
using C = char;
using B = bool;
using Lli = long long int;

vector<pair<I, I>> pais;
vector<I> pois;
vector<pair<I, pair<I, I>>> mids; 
multiset<I> low_lows;
multiset<I> low_upps;
multiset<I> upp_lows;
multiset<I> upp_upps;
Lli dis = 0;

Lli slv1() {
  for (const auto [s, t] : pais) {
    pois.push_back(s);
    pois.push_back(t);
  }
  const I mid = pois.size() / 2;
  nth_element(pois.begin(), pois.begin() + mid, pois.end());
  const I med = pois[mid];
  Lli res = 0;
  for (const auto poi : pois)
    res += abs(med - poi);
  return res;
}

void upp_bal() {
  if (upp_lows.empty() && !upp_upps.empty()) {
    const I mov = *upp_upps.begin();
    upp_lows.insert(mov);
    upp_upps.erase(upp_upps.find(mov));
    return;
  }
  if (upp_upps.size() > upp_lows.size()) {
    const I las = *upp_lows.rbegin();
    const I mov = *upp_upps.begin();
    upp_lows.insert(mov);
    upp_upps.erase(upp_upps.find(mov));
    const I cur = *upp_lows.rbegin();
    dis += (upp_lows.size() - upp_upps.size() - 2) * (cur - las);
  }
  if (upp_lows.size() > upp_upps.size() + 1) {
    const I las = *upp_lows.rbegin();
    const I mov = *upp_lows.rbegin();
    upp_upps.insert(mov);
    upp_lows.erase(upp_lows.find(mov));
    const I cur = *upp_lows.rbegin();
    dis -= (upp_upps.size() - upp_lows.size()) * (las - cur);
  }
}

void low_bal() {
  if (low_upps.size() > low_lows.size()) {
    const I las = *low_lows.rbegin();
    const I mov = *low_upps.begin();
    low_lows.insert(mov);
    low_upps.erase(low_upps.find(mov));
    const I cur = *low_lows.rbegin();
    dis += (low_lows.size() - low_upps.size() - 2) * (cur - las);
  }
  if (low_lows.size() > low_upps.size() + 1) {
    const I las = *low_lows.rbegin();
    const I mov = *low_lows.rbegin();
    low_upps.insert(mov);
    low_lows.erase(low_lows.find(mov));
    const I cur = *low_lows.rbegin();
    dis -= (low_upps.size() - low_lows.size()) * (las - cur);
  }
}

void upp_add(I val) {
  if (upp_lows.empty()) {
    upp_lows.insert(val);
    return;
  }
  const I med = *upp_lows.rbegin();
  if (val > med) {
    upp_upps.insert(val);
    dis += val - med;
  } else {
    upp_lows.insert(val);
    dis += med - val;
  }
  upp_bal();
}

void low_add(I val) {
  if (low_lows.empty()) {
    low_lows.insert(val);
    return;
  }
  const I med = *low_lows.rbegin();
  if (val > med) {
    low_upps.insert(val);
    dis += val - med;
  } else {
    low_lows.insert(val);
    dis += med - val;
  }
  low_bal();
}

void upp_rem(I val) {
  const I med = *upp_lows.rbegin();
  if (val > med) {
    upp_upps.erase(upp_upps.find(val));
    dis -= val - med;
  } else {
    upp_lows.erase(upp_lows.find(val));
    dis -= med - val;
  }
  upp_bal();
}

Lli slv2() {
  for (const auto [s, t] : pais) {
    upp_add(s);
    upp_add(t);
  }
  for (const auto [s, t] : pais)
    mids.push_back({s + (t - s) / 2, {s, t}});
  sort(mids.begin(), mids.end());
  Lli res = dis;
  for (const auto [mid, pai] : mids) {
    const auto [s, t] = pai;
    upp_rem(s);
    upp_rem(t);
    low_add(s);
    low_add(t);
    res = min(res, dis);
  }
  return res;
}

I main(void) {
  cin.tie(0)->sync_with_stdio(0);
  I k, n;
  cin >> k >> n;
  Lli res = 0;
  for (I i = 0; i < n; i++) {
    C p, q;
    I s, t;
    cin >> p >> s >> q >> t;
    if (s > t)
      swap(s, t);
    if (p != q) {
      pais.push_back({s, t});
      res++;
    } else
      res += t - s;
  }
  if (k == 1)
    res += slv1();
  else
    res += slv2();
  printf("%lli\n", res);
  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...