Submission #1094789

#TimeUsernameProblemLanguageResultExecution timeMemory
1094789DaciejMaciejPalembang Bridges (APIO15_bridge)C++17
100 / 100
502 ms8764 KiB
#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// #include <ext/rope>

using namespace std;
// using namespace __gnu_pbds;

typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef long double ld;

template <class T>

using VV = vector<vector<T>>;

using VI = vector<int>;
using VVI = vector<vector<int>>;

using VL = vector<long long>;
using VVL = vector<vector<long long>>;

using VC = vector<char>;
using VVC = vector<vector<char>>;

using VB = vector<bool>;
using VVB = vector<vector<bool>>;

using VD = vector<double>;
using VVD = vector<vector<double>>;

using PII = pair<int, int>;
using PLL = pair<long long, long long>;
using PIL = pair<int, long long>;
using PLI = pair<long long, int>;

using VPII = vector<pair<int, int>>;
using VPLL = vector<pair<long long, long long>>;



#define LINE '\n'
#define SPACE ' '
#define PB push_back
#define FOR(i, a, b) for (int i = (a); i < (int(b)); i++)

#define ALL(x) x.begin(), x.end()

#define sz(x) ((int)x.size())




template <class T>
void mini(T &a, T b)
{
    a = min(a, b);
}





priority_queue<int> lq;
priority_queue<int, VI, greater<int>>  rq;
ll lsum, rsum;

void insert(int x)
{
    int median = (sz(lq) ? lq.top() : 1e9 + 2137);
    if(x <= median) {
        lq.push(x);
        lsum += x;
    }
    else {
        rq.push(x);
        rsum += x;
    }

    if(sz(lq) > sz(rq) + 1) {
        int tmp = lq.top();
        lq.pop();
        rq.push(tmp);
        lsum -= tmp;
        rsum += tmp;
    }
    else if(sz(lq) < sz(rq)) {
        int tmp = rq.top();
        rq.pop();
        lq.push(tmp);
        rsum -= tmp;
        lsum += tmp;
    }
}

void solve()
{
    int n, k;
    cin >> k >> n;

    ll same = 0;

    VPII vec;
    vec.PB({0, 0});

    FOR(i, 0, n) {
        char a, b;
        int x, y;
        cin >> a >> x >> b >> y;
        if(a==b) same += abs(x-y);
        else vec.PB({x, y});
    }

    sort(ALL(vec), [](const PII &a, const PII &b) {return a.first + a.second < b.first + b.second;});
    n = sz(vec) - 1;
    lsum = rsum = 0;
    same += n; // because of bridge

    VL pref(n + 1, 0);

    FOR(i, 1, n + 1) {

        auto [x, y] = vec[i];
        insert(x);
        insert(y);
        cerr << lsum << SPACE << rsum << LINE;
        pref[i] = rsum - lsum;
    }

    ll ans = pref[n];

    if(k == 2) {
        while(sz(lq)) lq.pop();
        while(sz(rq)) rq.pop();

        lsum = rsum = 0;
        for(int i = n; i >= 1; i--) {
            auto [x, y] = vec[i];
            insert(x);
            insert(y);
            mini(ans, rsum - lsum + pref[i-1]);
        }
    }

    cout << same + ans << LINE;
}

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

    int t = 1;
    // cin >> t;

    while (t--)
        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...