Submission #1146633

#TimeUsernameProblemLanguageResultExecution timeMemory
1146633stdfloatCheerleaders (info1cup20_cheerleaders)C++20
51 / 100
2095 ms2956 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const int p = 31, md = (int)1e5 + 3;

int n, X, Y, mn = INT_MAX;

vector<bool> op, ans, vis(md + 1);

vector<int> a, v, pw, fn;

void f() {
	for (int i = 0; i < 2; i++) {
		if (!i) {
			if (!op.empty() && !op.back()) continue;

			for (int j = 0; j < Y; j++)
				swap(a[j], a[j + Y]);
		}
		else {
			if ((int)op.size() >= n && !count(op.end() - n, op.end(), 0)) continue;

			v = a;
			for (int j = 0; j < X; j++) {
				if (!(j & 1)) v[j >> 1] = a[j];
				else v[Y + (j >> 1)] = a[j];
			}

			a = v;
		}

		op.push_back(i);

		int sm = 0;
		for (int i = 0; i < X; i++)
			sm = (sm + a[i] * pw[i] % md) % md;

		if (!vis[sm]) {
			vis[sm] = true;

			int cnt = 0;
			fn.assign(X + 1, 0);
			for (int j = X - 1; j >= 0 && cnt < mn; j--) {
				for (int k = a[j]; k > 0; k -= k & -k)
					cnt += fn[k];
				for (int k = a[j] + 1; k <= X; k += k & -k)
					fn[k]++;
			}

			if (cnt < mn) {
				ans = op;
				mn = cnt;
			}

			f();
		}
		op.pop_back();
	
		if (!i) {
			for (int j = 0; j < Y; j++)
				swap(a[j], a[j + Y]);
		}
		else {
			v = a;
			for (int j = 0; j < X; j++) {
				if (j < Y) a[j << 1] = v[j];
				else a[((j - Y) << 1) + 1] = v[j];
			}
		}
	}
}

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

	cin >> n;

	X = 1 << n;
	Y = 1 << (n - 1);
	a.assign(X, 0);
	for (auto &i : a)
		cin >> i;

	pw.assign(X, 1);
	for (int i = 1; i < n; i++)
		pw[i] = pw[i - 1] * p % md;

	v.assign(X, 0);
	f();

	cout << mn << endl;
	for (auto i : ans)
		cout << i + 1;
}
#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...