Submission #810834

#TimeUsernameProblemLanguageResultExecution timeMemory
810834abczzPalembang Bridges (APIO15_bridge)C++14
100 / 100
286 ms16712 KiB
#include <iostream>
#include <vector>
#include <array>
#include <cstdlib>
#include <algorithm>
#include <map>
#define ll long long

using namespace std;

char C, D;
multimap <ll, ll> mp, mp2;
vector <ll> X;
vector <array<ll, 2> > V;
ll k, n, l, r, f, mn = 1e18, t, sl, sr, tl, tr;

int main() {
  cin >> k >> n;
  if (k == 1) {
    for (int i=0; i<n; ++i) {
      cin >> C >> l >> D >> r;
      if (l > r) swap(l, r);
      if (C == D) f += r-l;
      else {
        X.push_back(l);
        X.push_back(r);
      }
    }
    sort(X.begin(), X.end());
    for (auto u : X) {
      f += abs(X[X.size()/2]-u);
    }
    cout << f+X.size()/2 << '\n';
    return 0;
  }
  for (int i=0; i<n; ++i) {
    cin >> C >> l >> D >> r;
    if (l > r) swap(l, r);
    if (C == D) f += r-l;
    else V.push_back({l, r});
  }
  sort(V.begin(), V.end(), [](auto a, auto b) {
    return a[0]+a[1] < b[0]+b[1];
  });
  if (V.size() == 1) f += V[0][1]-V[0][0]+1;
  if (V.size() <= 1) {
    cout << f << '\n';
    return 0;
  }
  for (int i=0; i<V.size(); ++i) {
    mp2.insert({V[i][0], i});
    mp2.insert({V[i][1], i});
    t += V[i][0]+V[i][1];
  }
  auto md = mp.begin();
  auto md2 = mp2.begin();
  for (int i=0; i<V.size()-1; ++i) {
    sl += md2->first;
    md2 = next(md2);
  }
  sl += md2->first;
  sr = t-sl;
  for (int i=0; i<V.size()-1; ++i) {
    mp.insert({V[i][0], i});
    mp.insert({V[i][1], i});
    if (i) {
      if (V[i][1] < md->first) {
        tl -= md->first;
        tr += md->first;
        md = prev(md);
        tl += V[i][0]+V[i][1];
      }
      else if (V[i][0] >= md->first) {
        md = next(md);
        tl += md->first;
        tr -= md->first;
        tr += V[i][0]+V[i][1];
      }
      else tl += V[i][0], tr += V[i][1];
    }
    else {
      md = mp.begin();
      tl += V[i][0], tr += V[i][1];
    }
    if (V[i][0] == V[i][1] && V[i][0] == md2->first) {
      auto z = prev(md2);
      if (z->first != md2->first) {
        sl -= md2->first;
        sr += md2->first;
        md2 = prev(md2);
        sr -= V[i][0]+V[i][1];
      }
      else {
        md2 = next(md2);
        sl += md2->first;
        sr -= md2->first;
        sl -= V[i][0]+V[i][1];
      }
    }
    else if (V[i][1] <= md2->first) {
      md2 = next(md2);
      sl += md2->first;
      sr -= md2->first;
      sl -= V[i][0]+V[i][1];
    }
    else if (md2->first <= V[i][0]) {
      sl -= md2->first;
      sr += md2->first;
      md2 = prev(md2);
      sr -= V[i][0]+V[i][1];
    }
    else sl -= V[i][0], sr -= V[i][1];
    mp2.erase(mp2.lower_bound(V[i][0]));
    mp2.erase(mp2.lower_bound(V[i][1]));
    mn = min(mn, ((md->first+next(md)->first)/2)*((ll)mp.size()/2)-tl+tr-((md->first+next(md)->first)/2)*((ll)mp.size()/2)+
            ((md2->first+next(md2)->first)/2)*((ll)mp2.size()/2)-sl+sr-((md2->first+next(md2)->first)/2)*((ll)mp2.size()/2));
  }
  cout << mn+V.size()+f << '\n';
}

Compilation message (stderr)

bridge.cpp: In function 'int main()':
bridge.cpp:50:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |   for (int i=0; i<V.size(); ++i) {
      |                 ~^~~~~~~~~
bridge.cpp:57:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |   for (int i=0; i<V.size()-1; ++i) {
      |                 ~^~~~~~~~~~~
bridge.cpp:63:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |   for (int i=0; i<V.size()-1; ++i) {
      |                 ~^~~~~~~~~~~
#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...