Submission #1272014

#TimeUsernameProblemLanguageResultExecution timeMemory
1272014bbldrizzyPalembang Bridges (APIO15_bridge)C++20
0 / 100
1 ms572 KiB

#include <bits/stdc++.h>
#include <ios>
#include <iostream>
#include <set>
#include <random>
using namespace std;
using ll = long long;
using P = pair<ll, ll>;
#define f first
#define s second
const int MOD = 1e9+7;
const ll inf = 4*1e18;
const int mx = 5*1e5+5;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};

int main() {
    // freopen("input.in", "r", stdin);
    // freopen("lifeguards.in", "r", stdin);
    // freopen("lifeguards.out", "w", stdout);
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    int n, k; cin >> k >> n;
    vector<pair<ll, P>> v;
    ll ans = 0;
    vector<ll> st1;
    ll tot1 = 0;
    ll low1 = 0;
    vector<ll> st2;
    ll tot2 = 0;
    ll low2 = 0;
    for (int i = 0; i < n; i++) {
        char t1, t2; ll a, b; cin >> t1 >> a >> t2 >> b;
        if (t1 == t2) {
            ans += abs(a-b);
        } else {
            v.push_back({a+b, {a, b}});
        }
    }
    sort(v.begin(), v.end());
    // for (auto it: st2) {
    //     cout << it << "\n";
    // }
    ll nm = v.size();
    vector<ll> med1(nm);
    for (int i = 1; i < nm; i++) {
        ll a = v[i-1].s.f; ll b = v[i-1].s.s;
        if (st1.empty()) {
            tot1 = a+b;
            low1 = min(a, b);
            st1.push_back(min(a, b));
            st1.push_back(max(a, b));
        } else {
            tot1 += (a+b);
            ll mid = st1[(st1.size()-1)/2];
            if (a <= mid && b <= mid) {
                low1 -= mid;
                low1 += (a+b);
            } else if (a > mid && b > mid) {
                low1 += min({a, b, st1[(st1.size())/2]});
            } else {
                low1 += min(a, b);
            }
            auto p1 = lower_bound(st1.begin(), st1.end(), a);
            st1.insert(p1, a);
            auto p2 = lower_bound(st1.begin(), st1.end(), b);
            st1.insert(p2, b);
        }
        // cout << "tot1: " << tot1 << "\n";
        // cout << "low1: " << low1 << "\n";
        med1[i] = tot1-2*low1;
    }
    // for (auto it: med1) {
    //     cout << it << "\n";
    // }
    vector<ll> med2(nm);
    for (int i = nm-1; i > 0; i--) {
        ll a = v[i].s.f; ll b = v[i].s.s;
        if (st2.empty()) {
            tot2 = a+b;
            low2 = min(a, b);
            st2.push_back(min(a, b));
            st2.push_back(max(a, b));
        } else {
            tot2 += (a+b);
            ll mid = st2[(st2.size()-1)/2];
            if (a <= mid && b <= mid) {
                low2 -= mid;
                low2 += (a+b);
            } else if (a > mid && b > mid) {
                low2 += min({a, b, st2[(st2.size())/2]});
            } else {
                low2 += min(a, b);
            }
            auto p1 = lower_bound(st2.begin(), st2.end(), a);
            st2.insert(p1, a);
            auto p2 = lower_bound(st2.begin(), st2.end(), b);
            st2.insert(p2, b);
        }
        // cout << "tot1: " << tot1 << "\n";
        // cout << "low1: " << low1 << "\n";
        med2[i] = tot2-2*low2;
    }
    // for (auto it: med2) {
    //     cout << it << "\n";
    // }
    ll mn = inf;
    for (int i = 1; i <= nm-1; i++) {
        mn = min(mn, med1[i]+med2[i]);
    }
    cout << mn+ans+nm;
}
#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...