Submission #25325

#TimeUsernameProblemLanguageResultExecution timeMemory
25325tlwpdusPalembang Bridges (APIO15_bridge)C++14
100 / 100
139 ms5824 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;

struct median {
    int sz;
    ll sum1, sum2;
    priority_queue<int> pq1;
    priority_queue<int,vector<int>,greater<int> > pq2;
    median() {sz = 0; sum1 = sum2 = 0;}
    void cle() {
        sz = 0; sum1 = sum2 = 0;
        while(!pq1.empty()) pq1.pop();
        while(!pq2.empty()) pq2.pop();
    }
    void push(int a) {
        if (sz&1) {
            if (a<pq1.top()) {
                pq1.push(a);
                sum1 += a;
                pq2.push(pq1.top());
                sum2 += pq1.top();
                sum1 -= pq1.top();
                pq1.pop();
            }
            else {
                sum2+=a;
                pq2.push(a);
            }
        }
        else {
            if (pq1.empty()||a<pq1.top()) {
                sum1+=a;
                pq1.push(a);
            }
            else {
                pq2.push(a);
                sum2+=a;
                pq1.push(pq2.top());
                sum1+=pq2.top();
                sum2-=pq2.top();
                pq2.pop();
            }
        }
        sz++;
    }
    ll getmed() {
        if (pq1.empty()) return 0;
        ll med = pq1.top();
        return ((int)pq1.size()-(int)pq2.size())*med-sum1+sum2;
    }
} md;

int k, n, p;
pii arr[100100];
ll val[2][100100];
ll res;

bool cmp(pii a, pii b) {return a.first+a.second<b.first+b.second;}
int main() {
    int i;

    //freopen("input","r",stdin);

    scanf("%d%d",&k,&n);
    for (i=0;i<n;i++) {
        char a[3], c[3]; int b, d;
        scanf("%s%d%s%d",a,&b,c,&d);
        if (a[0]==c[0]) res += abs(d-b);
        else {
            arr[p++] = pii(b,d);
            res++;
        }
    }
    if (k==1) {
        for (i=0;i<p;i++) {
            md.push(arr[i].first);
            md.push(arr[i].second);
        }
        printf("%lld\n",res+md.getmed());
        return 0;
    }
    sort(arr,arr+p,cmp);
    for (i=0;i<p;i++) {
        md.push(arr[i].first);
        md.push(arr[i].second);
        val[0][i+1] = md.getmed();
    }
    md.cle();
    for (i=p-1;i>=0;i--) {
        val[1][i+1] = md.getmed();
        md.push(arr[i].first);
        md.push(arr[i].second);
    }
    val[1][0] = md.getmed();
    ll mini = (1LL<<60);
    for (i=0;i<=p;i++) mini = min(mini,val[0][i]+val[1][i]);
    printf("%lld\n",res+mini);

    return 0;
}

Compilation message (stderr)

bridge.cpp: In function 'int main()':
bridge.cpp:68:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d",&k,&n);
                        ^
bridge.cpp:71:36: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%s%d%s%d",a,&b,c,&d);
                                    ^
#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...