Submission #171234

#TimeUsernameProblemLanguageResultExecution timeMemory
171234VEGAnnPalembang Bridges (APIO15_bridge)C++14
100 / 100
405 ms14504 KiB
#include <bits/stdc++.h>
#define sz(x) ((int)x.size())
#define all(x) x.begin(),x.end()
#define PB push_back
#define MP make_pair
#define ft first
#define sd second
#define pii pair<int,int>
using namespace std;
typedef long long ll;
const ll OO = 1e18;
ll best = OO, extra = 0;
vector<ll> fi, se;
vector<pii> seg;
multiset<int> big, sml;
int k, n;

void solve(vector<ll> &vc){
    vc[0] = 0;
    ll sum_big = 0ll;
    ll sum_sml = 0ll;
    big.clear();
    sml.clear();

    int mid = 0;
    for (int i = 0; i < sz(seg); i++) {
        if (seg[i].ft <= mid && seg[i].sd >= mid){
            big.insert(seg[i].sd);
            sml.insert(seg[i].ft);
            sum_big += seg[i].sd;
            sum_sml += seg[i].ft;
        } else if (seg[i].sd < mid){
            sml.insert(seg[i].sd);
            sml.insert(seg[i].ft);
            sum_sml += seg[i].ft;
            sum_sml += seg[i].sd;
            ll cur = *(--sml.end());
            sum_big += cur;
            sum_sml -= cur;
            sml.erase(--sml.end());
            big.insert(cur);
        } else {
            big.insert(seg[i].sd);
            big.insert(seg[i].ft);
            sum_big += seg[i].ft;
            sum_big += seg[i].sd;
            ll cur = *(big.begin());
            sum_sml += cur;
            sum_big -= cur;
            big.erase(big.begin());
            sml.insert(cur);
        }
        vc[i + 1] = sum_big - sum_sml;
        mid = (*big.begin());
    }
}

bool cmp(pii x, pii y){
    return (x.ft + x.sd) < (y.ft + y.sd);
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> k >> n;
    for (int i = 0; i < n; i++){
        char c1, c2; int x, y;
        cin >> c1 >> x >> c2 >> y;
        if (c1 == c2){
            extra += abs(x - y);
        } else {
            extra++;
            if (x > y) swap(x, y);
            seg.PB(MP(x, y));
        }
    }
    sort(all(seg), cmp);
    fi.resize(sz(seg) + 1);
    se.resize(sz(seg) + 1);
    solve(fi);
    reverse(all(seg));
    solve(se);
    reverse(all(se));
    int bd = (k == 1 ? 1 : sz(fi));
    for (int i = 0; i < bd; i++)
        best = min(best, fi[i] + se[i]);
    if (best == OO)
        best = 0;
    cout << extra + best;
    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...