이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define ff first
#define ss second
using namespace std;
const int maxn = 17;
pair<long long, long long> cnt[maxn];
long long ans = 0x3f3f3f3f3f3f3f;
int opt = 0, h = 0;
int n;
void dfs(int d, vector<int> vec) {
	long long c0, c1, t0, t1;
	vector<int> L, R;
	c0 = c1 = t0 = t1 = 0;
	for (int v : vec) {
		if ((v>>d) & 1) c1++, t1 += c0, R.emplace_back(v);
		else c0++, t0 += c1, L.emplace_back(v);
	}
	cnt[d].ff += t0, cnt[d].ss += t1;
	if (d--) dfs(d, L), dfs(d, R);
}
void solve() {
	cin >> n;
	ans = 1ll * (1<<n) * ((1<<n)-1) / 2;
	vector<int> vec(1<<n);
	for (int i = 0, x; i < 1<<n; i++)
		cin >> x, vec[x] = i;
	long long cntmp = 0, optmp = 0;
	for (int i = 0; i < n; i++) {
		dfs(n-1, vec);
		cntmp = optmp = 0;
		for (int j = 0; j < n; j++) {
			if (cnt[j].ff > cnt[j].ss)
				cntmp += cnt[j].ss, optmp |= (1<<((j+i)%n));
			else cntmp += cnt[j].ff;
			cnt[j] = {0, 0};
		}
		if (cntmp < ans) ans = cntmp, opt = optmp, h = i;
		for (int j = 0; j < 1<<n; j++)
			vec[j] = (vec[j]>>1) | ((vec[j]&1)<<(n-1));	
	}
	string str;
	for (int i = 0; i < n; i++) {
		str.push_back('2');
		if ((opt>>i)&1) str.push_back('1');
	}
	while (h--) str.push_back('2');
	cout << ans << '\n' << str << '\n';
}
signed main() {
	solve();
	return 0;
}
| # | 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... |