Submission #501153

#TimeUsernameProblemLanguageResultExecution timeMemory
501153LucaIlieArranging Shoes (IOI19_shoes)C++17
100 / 100
275 ms275976 KiB
#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>
#include "shoes.h"

#define MAX_N 200000

using namespace std;

struct shoe_pair {
    int left, right;

    bool operator < (const shoe_pair &a) const {
        return left + right < a.left + a.right;
    }
};

struct aib {
    long long aib[MAX_N + 1];

    void update( int i, int x ) {
        while ( i <= MAX_N ) {
            aib[i] += x;
            i += (i & -i);
        }
    }

    int query( int i ) {
        int s;

        s = 0;
        while ( i > 0 ) {
            s += aib[i];
            i -= (i & -i);
        }

        return s;
    }
};

int p[2 * MAX_N + 1];
queue <int> q[2 * MAX_N + 2];
shoe_pair pairs[MAX_N];
aib change;

long long count_swaps( vector <int> s ) {
    int n, nrPairs, i;
    long long nrSwaps;

    n = s.size() / 2;

    nrPairs = 0;
    for ( i = 0; i < 2 * n; i++ ) {
        if ( q[-s[i] + n].size() > 0 ) {
            if ( s[i] < 0 )
                pairs[nrPairs] = { i, q[-s[i] + n].front() };
            else
                pairs[nrPairs] = { q[-s[i] + n].front(), i };
            nrPairs++;
            q[-s[i] + n].pop();
        } else
            q[s[i] + n].push( i );
    }

    sort( pairs, pairs + n );

    for ( i = 0; i < n; i++ ) {
        pairs[i].left++;
        pairs[i].right++;
        p[pairs[i].left] = i;
        p[pairs[i].right] = i;
    }

    nrSwaps = 0;
    for ( i = 0; i < n; i++ ) {
        nrSwaps += pairs[i].left + 2 * i - change.query( pairs[i].left ) - (2 * i + 1);
        change.update( pairs[i].left, 1 );
        nrSwaps += pairs[i].right + 2 * i + 1 - change.query( pairs[i].right ) - (2 * i + 2);
        change.update( pairs[i].right, 1 );
    }

    return nrSwaps;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...