Submission #675216

#TimeUsernameProblemLanguageResultExecution timeMemory
675216vjudge1Cheerleaders (info1cup20_cheerleaders)C++17
84 / 100
615 ms7180 KiB
/*
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize("unroll-loops")
*/
// lethal option

#include<bits/stdc++.h>
using namespace std;

#define all(flg) flg.begin(), flg.end()
#define int long long
#define pb push_back
#define fi first
#define se second
#define endl "\n"
#define eb emplace_back
#define ii pair<int, int>
#define vi vector<int>
#define PI 3.141592653589793238462643383279502884
#define ll long long
#define ld long double
#define for1(i, ff, gg) for(int i = ff; i <= gg; ++i)
#define for2(i, ff, gg) for(int i = ff; i >= gg; --i)
#define FOR1(i, ff, gg) for(int i = ff; i < gg; ++i)
#define loopa FOR1(i, 0, (1 << n))
const ll mod = 1e9 + 7;
const int maxN = 300005;
const ll oo = 1e18 + 7;
int n, a[maxN], b[maxN];
int x, y, z, k;

int temp[maxN];

vi stat_s;
vi s;
int res[100];
int antires[100];

void subsolve(int sta, int ds, vi &kal){
    if(ds == -1){
        kal.pb(a[sta]);
        return;
    }
    vi f1, f2;
    int sz = (1 << ds);
    subsolve(sta, ds - 1, f1);
    subsolve(sta + sz, ds - 1, f2);
    kal.resize(sz * 2);
    merge(all(f1), all(f2), kal.begin());
    int vl = 0;
    f1.pb(mod);
    // f2 < f1 -> inversion
    int id = 0;

    for(int cc : f2){
        while(cc > f1[id]) ++id;
        vl += id;
    }
    // cout << sta << " " << ds << " " << vl << " " << (sz * sz) - vl << endl;
    res[ds] += (sz * sz) - vl;
    antires[ds] += vl;
}

pair<int, vi> best, tester;

void solve(){
    loopa{
        b[i] = a[i];
        // cout << b[i] << " ";
    }
    // cout << endl;
    s.clear();
    memset(res, 0, sizeof(res));
    memset(antires, 0, sizeof(antires));
    vi kal;
    subsolve(0, n - 1, kal);
    int total = 0;
    FOR1(i, 0, n){
        s.pb(2);
        if(res[i] > antires[i]) s.pb(1);
        total += min(res[i], antires[i]);
    }
    tester.se.clear();
    tester.fi = total;
    // cout << total << endl;
    for(int cc : stat_s) tester.se.pb(cc);
    for(int cc :      s) tester.se.pb(cc);
    best = min(best, tester);
}

signed main(){
    // freopen(".inp", "r", stdin);
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> n;
    best.fi = oo;
    FOR1(i, 0, (1 << n)) cin >> a[i];
    for1(i, 1, n){
        stat_s.pb(2);
        loopa{
            int mask = i + ((1 << n) * (i & 1));
            mask >>= 1;
            temp[mask] = a[i];
        }
        loopa a[i] = temp[i];
        solve();
    }
    cout << best.fi << endl;
    for(int cc : best.se) cout << cc;
    cout << endl;
}
#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...