Submission #234550

#TimeUsernameProblemLanguageResultExecution timeMemory
234550DodgeBallManPalembang Bridges (APIO15_bridge)C++14
100 / 100
96 ms8824 KiB
#include <bits/stdc++.h>
#define pii pair<long long, long long>
#define x first
#define y second

using namespace std;
 
const int N = 1e5 + 10;
int k, n;
long long ans, dpl[N], dpr[N], suml, sumr;
vector<pii> v;
priority_queue<long long> L;
priority_queue<long long, vector<long long>, greater<long long>> R;
void add( long long x ) {
    int sz = L.size() + R.size();
    if( L.empty() || x <= L.top() ) {
        //printf("L : %d\n",x);
        L.emplace( x );
        suml += x, sz++;
        while( L.size() > ( sz+1 ) / 2 ) {
            //printf("sz1 : %d %lld\n",sz,L.top());
            R.emplace( L.top() );
            sumr += L.top();
            suml -= L.top();
            L.pop();
        }
    }
    else {
        //printf("R : %d\n",x);
        R.emplace( x );
        sumr += x, sz++;
        while( R.size() > ( sz+1 ) / 2 ) {
            //printf("sz2 : %d %lld\n",sz,R.top());
            L.emplace( R.top() );
            sumr -= R.top();
            suml += R.top();
            R.pop();
        }
    }
}

long long process( int idx ) {
    //printf("IDX : %d %lld %lld\n",idx,v[idx].x,v[idx].y);
    add( v[idx].x ), add( v[idx].y );
    int sz = L.size() + R.size();
    //printf("L : %d %lld %lld R : %d %lld %lld\n",L.size(),L.top(),suml,R.size(),R.top(),sumr);
    long long median = L.size() == ( sz + 1 ) / 2 ? L.top() : R.top();
    //printf("%d %d %lld\n",sz,idx,median);
    return median * ( L.size() - R.size() ) - suml + sumr;
}

int main()
{
    scanf("%d %d",&k,&n);
    for( int i = 1 ; i <= n ; i++ ) {
        char a, c;
        long long b, d;
        scanf(" %c %lld %c %lld",&a,&b,&c,&d);
        if( b > d ) swap( b, d );
        if( a == c ) ans += d - b;
        else v.emplace_back( pii( b, d ) );
    }
    if( v.empty() ) return !printf("%lld",ans);
    ans += v.size();
    sort( v.begin(), v.end(), [&]( const pii &a, const pii &b ) {
        return a.x + a.y < b.x + b.y;
    });
    for( int i = 1 ; i <= v.size() ; i++ ) dpl[i] = process( i-1 );
    L = priority_queue<long long>();
    R = priority_queue<long long, vector<long long>, greater<long long>>();
    suml = sumr = 0LL;
    for( int i = v.size() ; i >= 1 ; i-- ) dpr[i] = process( i-1 );
    if( k == 1 ) return !printf("%lld",ans+dpl[v.size()]);
    long long tmp = 2e18;
    for( int i = 1 ; i < v.size() ; i++ ) tmp = min( tmp, dpl[i] + dpr[i+1] );
    printf("%lld",ans+tmp);
    return 0;
}

Compilation message (stderr)

bridge.cpp: In function 'void add(long long int)':
bridge.cpp:20:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while( L.size() > ( sz+1 ) / 2 ) {
                ~~~~~~~~~^~~~~~~~~~~~~~
bridge.cpp:32:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while( R.size() > ( sz+1 ) / 2 ) {
                ~~~~~~~~~^~~~~~~~~~~~~~
bridge.cpp: In function 'long long int process(int)':
bridge.cpp:47:33: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     long long median = L.size() == ( sz + 1 ) / 2 ? L.top() : R.top();
                        ~~~~~~~~~^~~~~~~~~~~~~~~~~
bridge.cpp: In function 'int main()':
bridge.cpp:68:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for( int i = 1 ; i <= v.size() ; i++ ) dpl[i] = process( i-1 );
                      ~~^~~~~~~~~~~
bridge.cpp:75:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for( int i = 1 ; i < v.size() ; i++ ) tmp = min( tmp, dpl[i] + dpr[i+1] );
                      ~~^~~~~~~~~~
bridge.cpp:54:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d",&k,&n);
     ~~~~~^~~~~~~~~~~~~~~
bridge.cpp:58:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf(" %c %lld %c %lld",&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...