Submission #524145

#TimeUsernameProblemLanguageResultExecution timeMemory
524145LucaIlieCheerleaders (info1cup20_cheerleaders)C++17
0 / 100
1976 ms1952 KiB
#include <iostream>
#include <vector>

#define MAX_N 17

using namespace std;

struct AIB {
    int aib[(1 << MAX_N) + 1];

    int query( int i ) {
        int s;

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

        return s;
    }

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

AIB f;

long long countInv( int v[], int n ) {
    int i;
    long long nrInv;

    nrInv = 0;
    for ( i = 0; i < n; i++ ) {
        nrInv += i - f.query( v[i] );
        f.update( v[i] + 1, 1 );
    }
    for ( i = 0; i < n; i++ )
        f.update( v[i] + 1, -1 );

    return nrInv;
}

int v[1 << MAX_N], p[1 << MAX_N];
long long sumInv[MAX_N + 1];
vector <int> ans;

int main() {
    int n, rot, xr, r, x, l, i, j;
    long long minInv, nrInv, newInv;

    cin >> n;
    for ( i = 0; i < (1 << n); i++ )
        cin >> p[i];

    minInv = (1LL << (2 * n));
    xr = rot = 0;
    for ( r = 0; r < n; r++ ) {
        for ( i = 0; i < (1 << n); i++ )
            v[i] = p[i];

        for ( l = 0; l <= n; l++ ) {
            sumInv[l] = 0;
            for ( i = 0; i < (1 << n) - (1 << l) + 1; i += (1 << l) )
                sumInv[l] += countInv( p + i, (1 << l) );
        }

        x = 0;
        nrInv = sumInv[n];
        for ( l = n - 1; l >= 0; l-- ) {
            newInv = sumInv[n] - sumInv[l + 1] + ((1LL << (l + n - 1)) - sumInv[l]);
            if ( newInv < sumInv[n] ) {
                x += (1 << l);
                for ( i = 0; i < (1 << n) - (1 << (l + 1)) + 1; i += (1 << (l + 1)) ) {
                    for ( j = 0; j < (1 << l); j++ )
                        swap( v[i + j], v[i + j + (1 << l)] );
                }
            }
        }

        nrInv = countInv( v, (1 << n) );

        if ( nrInv < minInv ) {
            minInv = nrInv;
            rot = r;
            xr = x;
        }

        for ( i = 0; i < (1 << n); i++ )
            v[i] = p[i];
        for ( i = 0; i < (1 << n); i++ )
            p[((i & 1) << (n - 1)) + (i >> 1)] = v[i];
    }

    cout << minInv << "\n";
    for ( i = 0; i < rot; i++ )
        cout << 2;
    for ( i = 0; i < n; i++ ) {
        cout << 2;
        if ( (xr >> i) & 1 )
            cout << 1;
    }

    return 0;
}
#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...