제출 #931164

#제출 시각아이디문제언어결과실행 시간메모리
931164a_l_i_r_e_z_aPalembang Bridges (APIO15_bridge)C++17
100 / 100
156 ms13648 KiB
// In the name of God
// Hope is last to die

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

#define pb push_back
// #define int long long
#define S second
#define F first
#define mp make_pair
#define smax(x, y) (x) = max((x), (y))
#define smin(x, y) (x) = min((x), (y))
#define all(x) (x).begin(), (x).end()
#define len(x) ((int)(x).size())

const int maxn = 1e5 + 5;
const int inf = 1e9 + 7;
ll k, n, sup, slow, ps[maxn];
vector<pii> a;
multiset<int> up, low;

bool cmp(pii x, pii y){
    return x.F + x.S < y.F + y.S;
}

void reset(){
    if(up.size() > low.size()){
        int x = (*up.begin());
        low.insert(x);
        up.erase(up.find(x));
        slow += x;
        sup -= x;
    }
    if(low.size() > up.size() + 1){
        int x = (*low.rbegin());
        low.erase(low.find(x));
        up.insert(x);
        sup += x;
        slow -= x;
    }
}

void insert(int x){
    int mid = (low.size() ? (*low.rbegin()) : inf);
    if(x > mid){
        up.insert(x);
        sup += x;
    }
    else{
        low.insert(x);
        slow += x;
    }
    reset();
}

int32_t main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    
    cin >> k >> n;
    ll sum = 0;
    for(int i = 0; i < n; i++){
        char h, g;
        int u, v;
        cin >> h >> u >> g >> v;
        if(h == g) sum += abs(u - v);
        else a.pb(mp(u, v));
    }
    sort(all(a), cmp);
    n = a.size();
    sum += n;
    for(int i = 0; i < n; i++){
        insert(a[i].S);
        insert(a[i].F);
        ps[i] = sup - slow;
    }
    ll ans = ps[n - 1] + sum;
    if(k == 2){
        low.clear();
        up.clear();
        slow = 0;
        sup = 0;
        for(int i = n - 1; i >= 1; i--){
            insert(a[i].F);
            insert(a[i].S);
            smin(ans, sum + sup - slow + ps[i - 1]);
        }
    }
    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...