Submission #162281

#TimeUsernameProblemLanguageResultExecution timeMemory
162281rama_pangPalembang Bridges (APIO15_bridge)C++14
100 / 100
588 ms18508 KiB
#include <bits/stdc++.h>
using namespace std;
using lint = long long;

lint solve(lint K, vector<pair<lint, lint>> A) {
    if (A.empty()) 
        return 0;

    lint N = A.size();
    vector<lint> points;
    sort(A.begin(), A.end(), [&](pair<lint, lint> l, pair<lint, lint> r) {
        return l.first + l.second < r.first + r.second;
    });

    auto running_median = [&](vector<pair<lint, lint>> A) {
        multiset<lint> sml;
        multiset<lint> big;
        lint sum_sml = 0, sum_big = 0;
        vector<lint> res(N + 1, 0);

        for (int i = 1; i <= N; i++) {
            sml.emplace(A[i - 1].first);
            sum_sml += A[i - 1].first;
            big.emplace(A[i - 1].second);
            sum_big += A[i - 1].second;

            while (*sml.rbegin() > *big.begin()) {
                sum_sml += *big.begin() - *sml.rbegin();
                sum_big += *sml.rbegin() - *big.begin();
                big.emplace(*sml.rbegin());
                sml.emplace(*big.begin());
                sml.erase(prev(sml.end()));
                big.erase(big.begin());
            }

            res[i] = sum_big - sum_sml;
        }

        return res;
    };

    vector<lint> prefix_median = running_median(A);
    reverse(A.begin(), A.end());
    vector<lint> suffix_median = running_median(A);
    reverse(A.begin(), A.end());

    lint res = INT64_MAX;

    for (int cur = 0; cur <= N; cur++) {
        res = min(res, prefix_median[cur] + suffix_median[N - cur]);
    }

    if (K == 1)
        res = prefix_median[N];

    return res;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    lint K, N, ans = 0;
    vector<pair<lint, lint>> A;

    cin >> K >> N;

    for (int i = 0; i < N; i++) {
        char Z1, Z2;
        lint B1, B2;

        cin >> Z1 >> B1 >> Z2 >> B2;
        if (B1 > B2) swap(B1, B2);
        if (Z1 == Z2)
            ans += B2 - B1;
        else
            A.emplace_back(B1, B2);
    }

    cout << ans + A.size() + solve(K, A) << "\n";

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