Submission #1352971

#TimeUsernameProblemLanguageResultExecution timeMemory
1352971Born_To_LaughPalembang Bridges (APIO15_bridge)C++17
100 / 100
33 ms4016 KiB
// Born_To_Laugh - Hughie Do
#include <bits/stdc++.h>
#define alle(AC) AC.begin(), AC.end()
#define fi first
#define se second
using namespace std;
typedef long long ll;
[[maybe_unused]] const int MOD = 998244353, INF = 1e9 + 7;

const int maxn = 1e5 + 10;
int m, k, n;
pair<int, int> item[maxn];
ll pref[maxn], suff[maxn];
priority_queue<int> pql; // max heap
priority_queue<int, vector<int>, greater<>> pqr; // min heap
ll suml = 0, sumr = 0; // sumr - x * k + x * k - suml
void balance(){
    if(pql.size() == pqr.size()) return;
    if(pql.size() > pqr.size()){
        int x = pql.top();
        pql.pop();
        pqr.push(x);

        suml -= x;
        sumr += x;
    }
    if(pqr.size() > pql.size()){
        int x = pqr.top();
        pqr.pop();
        pql.push(x);

        sumr -= x;
        suml += x;
    }
}
void solve(){
    cin >> k >> m;
    ll basecost = 0; n = 0;
    for(int i=1; i<=m; ++i){
        char p, q; int s, t;
        cin >> p >> s >> q >> t;
        if(s > t) swap(s, t);
        if(p == q) basecost += t - s;
        else{
            item[++n] = {s, t};
            basecost++;
        }
    }
    sort(item + 1, item + 1 + n, [](pair<int, int> a, pair<int, int> b){
        return a.fi + a.se < b.fi + b.se;
    });
    for(int i=1; i<=n; ++i){
        if(pql.empty() || item[i].fi <= pql.top()){
            pql.push(item[i].fi);
            suml += item[i].fi;
        }
        else{
            pqr.push(item[i].fi);
            sumr += item[i].fi;
        }

        if(pql.empty() || item[i].se <= pql.top()){
            pql.push(item[i].se);
            suml += item[i].se;
        }
        else{
            pqr.push(item[i].se);
            sumr += item[i].se;
        }
        balance();
        pref[i] = sumr - suml;
    }
    pql = priority_queue<int>();
    pqr = priority_queue<int, vector<int>, greater<>>();
    suml = sumr = 0;
    for(int i=n; i>=1; --i){
        if(pql.empty() || item[i].fi <= pql.top()){
            pql.push(item[i].fi);
            suml += item[i].fi;
        }
        else{
            pqr.push(item[i].fi);
            sumr += item[i].fi;
        }
        
        if(pql.empty() || item[i].se <= pql.top()){
            pql.push(item[i].se);
            suml += item[i].se;
        }
        else{
            pqr.push(item[i].se);
            sumr += item[i].se;
        }
        balance();
        suff[i] = sumr - suml;
    }
    ll ans = basecost + pref[n];
    if(k == 2){
        for(int i=0; i<=n; ++i) ans = min(ans, basecost + pref[i] + suff[i + 1]);
    }
    cout << ans << '\n';
}
signed main(){
    // freopen("inp.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
}
#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...