제출 #1366557

#제출 시각아이디문제언어결과실행 시간메모리
1366557JohanPalembang Bridges (APIO15_bridge)C++20
22 / 100
100 ms15552 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 5;
const int INF = 1e18;

signed main(){
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int k, n, tot = 0;
  cin >> k >> n;
  set < int > st;
  vector < int > L, R, prL, prR;
  L = R = prL = prR = {0};
  vector < array < int , 2 > > v;
  for(int i = 0; i < n; i++){
    char ty1, ty2;
    int cor1, cor2;
    cin >> ty1 >> cor1 >> ty2 >> cor2;
    if(cor1 > cor2)
      swap(cor1, cor2);
    st.insert(cor1);
    st.insert(cor2);
    if(ty1 == ty2){
      tot += abs(cor1 - cor2);
    }
    else {
      L.push_back(cor1);
      R.push_back(cor2);
      v.push_back({cor1, cor2});
    }
  }
  sort(L.begin(), L.end());
  sort(R.begin(), R.end());
  for(int i : L){
    prL.push_back(i);
  }
  for(int i : R){
    prR.push_back(i);
  }
  for(int i = 1; i < prL.size(); i++)prL[i] += prL[i - 1];
  for(int i = 1; i < prR.size(); i++)prR[i] += prR[i - 1];
  int mn = INF;
  for(auto d : st){
    int cur = tot + v.size();
    int lo = 0, hi = L.size() - 1;
    int id1 = -1, id2 = -1;
    while(hi >= lo){
      int mid = (lo + hi) >> 1;
      if(L[mid] <= d){
        id1 = mid;
        lo = mid + 1;
      }
      else hi = mid - 1;
    }
    lo = 0, hi = R.size() - 1;
    while(hi >= lo){
      int mid = (lo + hi) >> 1;
      if(R[mid] <= d){
        id2 = mid;
        lo = mid + 1;
      }
      else hi = mid - 1;
    }
    id1++, id2++;
    cur += (id1 * d - prL[id1]) + (prL.back() - prL[id1] - (prL.size() - id1) * d);
    cur += (id2 * d - prR[id2]) + (prR.back() - prR[id2] - (prR.size() - id2) * d);
    mn = min(mn, cur);
  }
  cout << mn << endl;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…