Submission #428778

#TimeUsernameProblemLanguageResultExecution timeMemory
428778lycCheerleaders (info1cup20_cheerleaders)C++14
13 / 100
2085 ms1676 KiB
#include <bits/stdc++.h>
using namespace std;

#define TRACE(x) cerr << #x << " :: " << x << endl
#define _ << " " <<
#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(),(x).end()
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define RFOR(i,a,b) for(int i=(a);i>=(b);--i)

int N, A[1<<17];

int inv() {
    int cnt = 0;
    FOR(i,0,(1<<N)-1){
        FOR(j,0,i-1){
            if (A[j] > A[i]) ++cnt;
        }
    }
    return cnt;
}

void sim(int op) {
    if (op == 1) {
        FOR(i,0,(1<<(N-1))-1){
            swap(A[i],A[i+(1<<(N-1))]);
        }
    } else {
        vector<int> v[2];
        FOR(i,0,(1<<N)-1) v[i&1].push_back(A[i]);
        FOR(i,0,(1<<(N-1))-1) A[i] = v[0][i];
        FOR(i,0,(1<<(N-1))-1) A[i+(1<<(N-1))] = v[1][i];
    }
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);

    cin >> N;
    FOR(i,0,(1<<N)-1){
        cin >> A[i];
    }

    int mininv = 1e9;
    vector<int> ans;
    FOR(s,0,(1<<N)-1){
        vector<int> ops;
        while (true) {
            bool done = 1;
            int pos0 = -1;
            FOR(i,0,(1<<N)-1){
                done &= A[i] == i;
                if (A[i] == s) pos0 = i;
            }
            if (pos0 == 0) break;

            int op;
            if (pos0 < (1<<(N-1))) op = 2;
            else op = 1;
            ops.push_back(op);

            sim(op);
        }

        int cur = inv(), mini = 0;
        FOR(i,1,N-1){
            sim(2);
            int nw = inv();
            if (nw < cur) {
                cur = nw;
                mini = i;
            }
        }

        if (cur < mininv) {
            mininv = cur;
            FOR(i,1,mini) ops.push_back(2);
            ans = ops;
        }
    }

    cout << mininv << '\n';
    for (int& x : ans) {
        cout << x;
    }
}
#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...