Submission #1324229

#TimeUsernameProblemLanguageResultExecution timeMemory
1324229sh_qaxxorov_571Palembang Bridges (APIO15_bridge)C++20
100 / 100
99 ms8536 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

typedef long long ll;

struct Person {
    ll s, t;
};

// Mediana yordamida masofalarni hisoblash uchun Priority Queues usuli
struct MedianFinder {
    priority_queue<ll> left; // Max-heap
    priority_queue<ll, vector<ll>, greater<ll>> right; // Min-heap
    ll leftSum = 0, rightSum = 0;

    void add(ll val) {
        if (left.empty() || val <= left.top()) {
            left.push(val); leftSum += val;
        } else {
            right.push(val); rightSum += val;
        }
        // Balanslash
        if (left.size() > right.size() + 1) {
            ll tmp = left.top(); left.pop(); leftSum -= tmp;
            right.push(tmp); rightSum += tmp;
        } else if (right.size() > left.size()) {
            ll tmp = right.top(); right.pop(); rightSum -= tmp;
            left.push(tmp); leftSum += tmp;
        }
    }

    ll getCost() {
        ll median = left.top();
        return (median * (ll)left.size() - leftSum) + (rightSum - median * (ll)right.size());
    }
};

int main() {
    int K, N;
    cin >> K >> N;

    ll baseDist = 0;
    vector<Person> crossers;

    for (int i = 0; i < N; i++) {
        char pZ, qZ; ll s, t;
        cin >> pZ >> s >> qZ >> t;
        if (pZ == qZ) {
            baseDist += abs(s - t);
        } else {
            baseDist += 1; // Daryoni o'tish
            crossers.push_back({min(s, t), max(s, t)});
        }
    }

    if (crossers.empty()) {
        cout << baseDist << endl; return 0;
    }

    // K=1 holati
    sort(crossers.begin(), crossers.end(), [](Person a, Person b) {
        return a.s + a.t < b.s + b.t;
    });

    int M = crossers.size();
    if (K == 1) {
        vector<ll> allCoords;
        for (auto p : crossers) { allCoords.push_back(p.s); allCoords.push_back(p.t); }
        sort(allCoords.begin(), allCoords.end());
        ll median = allCoords[M];
        ll addCost = 0;
        for (ll c : allCoords) addCost += abs(c - median);
        cout << baseDist + addCost << endl;
    } else {
        // K=2 holati uchun Prefiks va Suffiks medianalar
        vector<ll> pref(M), suff(M);
        MedianFinder mfLeft, mfRight;

        for (int i = 0; i < M; i++) {
            mfLeft.add(crossers[i].s); mfLeft.add(crossers[i].t);
            pref[i] = mfLeft.getCost();
        }
        for (int i = M - 1; i >= 0; i--) {
            mfRight.add(crossers[i].s); mfRight.add(crossers[i].t);
            suff[i] = mfRight.getCost();
        }

        ll minAddCost = pref[M - 1];
        for (int i = 0; i < M - 1; i++) {
            minAddCost = min(minAddCost, pref[i] + suff[i + 1]);
        }
        cout << baseDist + minAddCost << endl;
    }

    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...