이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
/*
#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] += vl;
antires[ds] += (sz * sz) - 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;
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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |