제출 #1369678

#제출 시각아이디문제언어결과실행 시간메모리
1369678AMel0nPalembang Bridges (APIO15_bridge)C++20
100 / 100
54 ms6516 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int K, N; cin >> K >> N;
    int re = 0, ans;
    vector<int> S, T;
    for(int i = 0; i < N; i++) {
        char p, q; int s, t; cin >> p >> s >> q >> t;
        if (s > t) swap(s, t);
        if (p != q) S.push_back(s), T.push_back(t), re++;
        else re += t-s;
    }
    int M = S.size();
    if (!M) {cout << re; return 0;}
    vector<int> ord(M); 
    iota(ord.begin(), ord.end(), 0);
    sort(ord.begin(), ord.end(), [&](const int a, const int b){return S[a] + T[a] < S[b] + T[b];});

    priority_queue<int> le;
    priority_queue<int, vector<int>, greater<>> ri;
    int ls = 0, rs = 0;
    vector<int> cost;
    auto add = [&](int i) {
        le.push(S[i]), le.push(T[i]);
        ls += S[i], ls += T[i];
        while(le.size() && ri.size() && le.top() > ri.top()) {
            ls -= le.top(), rs += le.top();
            ri.push(le.top());
            le.pop();
        }
        while(le.size() < ri.size()) {
            ls += ri.top(), rs -= ri.top();
            le.push(ri.top());
            ri.pop();
        }
        while(le.size() > ri.size() + 1) {
            ls -= le.top(), rs += le.top();
            ri.push(le.top());
            le.pop();
        }
    };
    for(int &i: ord) {
        add(i);
        int med = le.top();
        cost.push_back(rs - med * ri.size() + med * le.size() - ls);
    }
    ans = cost[M-1];
    if (K == 2) {
        le = {}, ri = {}, ls = 0, rs = 0;
        for(int cnt = M-1; cnt; cnt--) {
            add(ord[cnt]);
            int med = le.top();
            ans = min(ans, cost[cnt-1] + rs - med * (int)ri.size() + med * (int)le.size() - ls);
        }
    }
    cout << re + ans;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…