Submission #807561

#TimeUsernameProblemLanguageResultExecution timeMemory
807561SorahISACheerleaders (info1cup20_cheerleaders)C++17
72 / 100
2070 ms2304 KiB
#ifndef SorahISA #define SorahISA #include SorahISA __FILE__ SorahISA void solve() { int N, NN; cin >> N, NN = (1 << N); vector<int> A(NN), inv(NN); for (int i = 0; i < NN; ++i) cin >> A[i], inv[A[i]] = i; if (N > 11) { auto ch1 = [&]() { for (int i = 0; i < NN/2; ++i) swap(A[i], A[i+NN/2]); // cerr << "\u001b[34m"; // for (int i = 0; i < NN; ++i) cerr << A[i] << " \n"[i == NN-1]; // cerr << "\u001b[0m"; }; auto ch2 = [&]() { static vector<int> B(NN); for (int i = 0; i < NN; i += 2) B[i/2] = A[i]; for (int i = 1; i < NN; i += 2) B[i/2+NN/2] = A[i]; A = B; // cerr << "\u001b[35m"; // for (int i = 0; i < NN; ++i) cerr << A[i] << " \n"[i == NN-1]; // cerr << "\u001b[0m"; }; int C = inv[0]; string ans = ""; for (int i = 0; i < N; ++i) { ans += "2", ch2(); if (C >> i & 1) ans += "1", ch1(); } while (!is_sorted(ALL(A))) { ans += "2", ch2(); } cout << 0 << "\n"; cout << ans << "\n"; return; } auto ch1 = [&](vector<int> &Z) { for (int i = 0; i < NN/2; ++i) swap(Z[i], Z[i+NN/2]); // cerr << "\u001b[34m"; // for (int i = 0; i < NN; ++i) cerr << Z[i] << " \n"[i == NN-1]; // cerr << "\u001b[0m"; }; auto ch2 = [&](vector<int> &Z) { static vector<int> B(NN); for (int i = 0; i < NN; i += 2) B[i/2] = Z[i]; for (int i = 1; i < NN; i += 2) B[i/2+NN/2] = Z[i]; Z = B; // cerr << "\u001b[35m"; // for (int i = 0; i < NN; ++i) cerr << Z[i] << " \n"[i == NN-1]; // cerr << "\u001b[0m"; }; auto calc_inv = [&](vector<int> &Z) -> int { static vector<int> BIT(NN+1); fill(ALL(BIT), 0); int64_t cnt = 0; for (int i = NN-1; i >= 0; --i) { for (int j = Z[i]+1; j > 0; j -= j&-j) cnt += BIT[j]; for (int j = Z[i]+1; j <= NN; j += j&-j) ++BIT[j]; } return cnt; }; int64_t min_inv = NN * (NN-1) / 2; string min_ans; for (int C = 0; C < NN; ++C) { vector<int> Z = A; string ans = ""; for (int i = 0; i < N; ++i) { ans += "2", ch2(Z); if (C >> i & 1) ans += "1", ch1(Z); } for (int i = 0; i < N; ++i) { if (int64_t tmp = calc_inv(Z); tmp < min_inv) min_inv = tmp, min_ans = ans; ans += "2", ch2(Z); } } cout << min_inv << "\n"; cout << min_ans << "\n"; } int32_t main() { fastIO(); int t = 1; // cin >> t; for (int _ = 1; _ <= t; ++_) { solve(); } return 0; } #else #ifdef local #define _GLIBCXX_DEBUG 1 #endif #pragma GCC optimize("Ofast", "unroll-loops") #include <bits/stdc++.h> using namespace std; // #define int int64_t // #define double __float80 using pii = pair<int, int>; template <typename T> using Prior = std::priority_queue<T>; template <typename T> using prior = std::priority_queue<T, vector<T>, greater<T>>; // #define X first // #define Y second #define eb emplace_back #define ef emplace_front #define ee emplace #define pb pop_back #define pf pop_front #define ALL(x) begin(x), end(x) #define RALL(x) rbegin(x), rend(x) #define SZ(x) ((int)(x).size()) #ifdef local #define fastIO() void() #define debug(...) \ fprintf(stderr, "%sAt [%s], line %d: (%s) = ", "\u001b[33m", __FUNCTION__, __LINE__, #__VA_ARGS__), \ _do(__VA_ARGS__), fprintf(stderr, "%s", "\u001b[0m") template <typename T> void _do(T &&_t) {cerr << _t << "\n";} template <typename T, typename ...U> void _do(T &&_t, U &&..._u) {cerr << _t << ", ", _do(_u...);} #else #define fastIO() ios_base::sync_with_stdio(0), cin.tie(0) #define debug(...) void() #endif mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); template <typename T, typename U> bool chmin(T &lhs, U rhs) {return lhs > rhs ? lhs = rhs, 1 : 0;} template <typename T, typename U> bool chmax(T &lhs, U rhs) {return lhs < rhs ? lhs = rhs, 1 : 0;} #endif
#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...