Submission #1017808

#TimeUsernameProblemLanguageResultExecution timeMemory
1017808aufanPalembang Bridges (APIO15_bridge)C++17
100 / 100
70 ms9808 KiB
#include <bits/stdc++.h>
#define int long long
#define fi first
#define se second

using namespace std;

const int inff = 1e18;

int32_t main()
{
        ios_base::sync_with_stdio(false);
        cin.tie(NULL);
        
        int k, n;
        cin >> k >> n;

        int ans = 0;
        vector<int> a, b;
        for (int i = 0; i < n; i++) {
                char p, q;
                int s, t;
                cin >> p >> s >> q >> t;

                if (p == q) {
                        ans += abs(s - t);
                } else {
                        if (s > t) swap(s, t);
                        a.push_back(s);
                        b.push_back(t);
                }
        }

        if (k == 1) {
                int m = (int)a.size();
                vector<int> c;
                for (int i = 0; i < m; i++) {
                        c.push_back(a[i]);
                        c.push_back(b[i]);
                }
                sort(c.begin(), c.end());
                
                ans += m;
                for (int i = 0; i < 2 * m; i++) {
                        ans += abs(c[i] - c[m]);
                }

                cout << ans << '\n';
        } else if (k == 2) {
                int m = (int)a.size();
                vector<pair<int, int>> c;
                for (int i = 0; i < m; i++) {
                        c.push_back({a[i], b[i]});
                }
                sort(c.begin(), c.end(), [&](pair<int, int> x, pair<int, int> y) {
                        return x.fi + x.se < y.fi + y.se;
                });

                int sl = 0, sr = 0;
                vector<int> pref(m);
                priority_queue<int> le;
                priority_queue<int, vector<int>, greater<int>> ri;
                for (int i = 0; i < m; i++) {
                        auto [a, b] = c[i];
                        sl += a;
                        le.push(a);
                        sr += b;
                        ri.push(b);
                        while (le.top() > ri.top()) {
                                int x = le.top(), y = ri.top();
                                sr += x;
                                ri.push(x);
                                sl += y;
                                le.push(y);
                                sr -= y;
                                ri.pop();
                                sl -= x;
                                le.pop();
                        }

                        pref[i] = ((i + 1) * le.top() - sl) + (sr - (i + 1) * le.top());
                }

                sl = sr = 0;
                while (!le.empty()) le.pop();
                while (!ri.empty()) ri.pop();
                vector<int> suf(m);
                for (int i = m - 1; i >= 0; i--) {
                        auto [a, b] = c[i];
                        sl += a;
                        le.push(a);
                        sr += b;
                        ri.push(b);
                        while (le.top() > ri.top()) {
                                int x = le.top(), y = ri.top();
                                sr += x;
                                ri.push(x);
                                sl += y;
                                le.push(y);
                                sr -= y;
                                ri.pop();
                                sl -= x;
                                le.pop();
                        }

                        suf[i] = ((m - i) * le.top() - sl) + (sr - (m - i) * le.top());
                }

                int mn = inff;
                ans += m;
                for (int i = 0; i < m - 1; i++) mn = min(mn, pref[i] + suf[i + 1]);
                if (m == 0) mn = 0;     
                ans += mn;

                cout << ans << '\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...