Submission #500304

#TimeUsernameProblemLanguageResultExecution timeMemory
500304beaconmcPalembang Bridges (APIO15_bridge)C++14
100 / 100
442 ms21412 KiB
#include <bits/stdc++.h>

typedef long long ll;
#define FOR(i, x, y) for(ll i=x; i<y; i++)
#define FORNEG(i, x, y) for(ll i=x; i>y; i--)
using namespace std;

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
  
#define ordered_set tree<ll, null_type,less_equal<ll>, rb_tree_tag,tree_order_statistics_node_update>

ll addlater;
vector<vector<ll> > tings;
ordered_set sustree;
ll rsum, lsum;
ll median, nextmed;
bool cmp(vector<ll> a, vector<ll> b) { return a[0] + a[1] < b[0] + b[1]; };

void insert(ll a, ll b){
    if (a>b) swap(a,b);
    if (sustree.size() !=0) median = *sustree.find_by_order(sustree.size()/2 - 1), nextmed = *sustree.find_by_order(sustree.size()/2);
    else median = a, nextmed = b; 
    

    if (a<=median && b>median) lsum += a, rsum += b;

    else if (a<=median && b<=median) lsum += a+b-median, rsum += median;

    else {
        sustree.insert(a); sustree.insert(b);
        median = *sustree.find_by_order(sustree.size()/2 - 1);
        lsum += median, rsum += a+b-median;
        goto skip;
    }

    sustree.insert(a); sustree.insert(b);
    skip:;
}

int main(){
    ll k, n;
    cin.tie(0)->sync_with_stdio(0);
    cin >> k >> n;
    FOR(i,0,n){
        char a,b;
        ll x,y;
        cin >> a >> x >> b >> y;

        if (a==b) addlater += abs(x-y);
        else tings.push_back({x,y});
    }
    n = tings.size();

    addlater += n;

    ll prefs[100001];

    sort(tings.begin(), tings.end(), cmp);
    rsum = 0; lsum = 0;

    FOR(i,0,n){
        insert(tings[i][0], tings[i][1]);
        prefs[i] = rsum - lsum;
    }
    ll ans = prefs[n-1];

    if (k==2){
        sustree.clear();
        rsum = 0; lsum = 0;
        FORNEG(i, n-1, 0){
            insert(tings[i][0], tings[i][1]);
            ans = min(ans, rsum - lsum + prefs[i-1]);
        }
    }
    cout << ans + addlater;
}
#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...