Submission #632175

#TimeUsernameProblemLanguageResultExecution timeMemory
632175PoonYaPatPalembang Bridges (APIO15_bridge)C++14
100 / 100
83 ms5204 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

struct A {
    int x,y;
} s[100001];

bool cmp(A a, A b) {
    return a.x+a.y<b.x+b.y;
}

int n,k;
ll ans,rsum,lsum,con,g[100001];

priority_queue<int> lsq;
priority_queue<int, vector<int>, greater<int>> rsq;

void add(int x) {
    int median = lsq.empty() ? 1000000002 : lsq.top();

    if (x<=median) lsq.push(x), lsum+=x;
    else rsq.push(x), rsum+=x;

    if (lsq.size() < rsq.size()) {
        int k=rsq.top();
        rsq.pop();
        lsq.push(k);
        rsum-=k;
        lsum+=k;
    }

    if (lsq.size() > rsq.size()+1) {
        int k=lsq.top();
        lsq.pop();
        rsq.push(k);
        rsum+=k;
        lsum-=k;
    }
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin>>k>>n;
    int idx=0;
    for (int i=0; i<n; ++i) {
        char a,b;
        int x,y;
        cin>>a>>x>>b>>y;
        if (a==b) con+=abs(x-y);
        else s[idx++]={x,y}, ++con;
    }
    sort(s,s+idx,cmp);

    for (int i=0; i<idx; ++i) add(s[i].x), add(s[i].y), g[i]=rsum-lsum;
    ans=rsum-lsum+con;

    if (k==1) {
        cout<<ans;
        return 0;
    }

    while (!lsq.empty()) lsq.pop();
    while (!rsq.empty()) rsq.pop();

    lsum=0; rsum=0;
    for (int i=idx-1; i>0; --i) {
        add(s[i].x); add(s[i].y);
        ans=min(ans,rsum-lsum+g[i-1]+con);
    }
    cout<<ans;
}
#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...