제출 #428831

#제출 시각아이디문제언어결과실행 시간메모리
428831lycCheerleaders (info1cup20_cheerleaders)C++14
72 / 100
1798 ms2332 KiB
#include <bits/stdc++.h> using namespace std; #define TRACE(x) cerr << #x << " :: " << x << endl #define _ << " " << #define SZ(x) ((int)(x).size()) #define ALL(x) (x).begin(),(x).end() #define FOR(i,a,b) for(int i=(a);i<=(b);++i) #define RFOR(i,a,b) for(int i=(a);i>=(b);--i) int N, org[1<<17], A[1<<17], tmp[2][1<<16]; int ft[1<<17], n, nn; void update(int i, int x) { for (; i <= n; i += i&-i) ft[i] += x; } int query(int i) { int r = 0; for (; i; i -= i&-i) r += ft[i]; return r; } int inv() { int cnt = 0; memset(ft,0,sizeof ft); FOR(i,0,(1<<N)-1){ cnt += i-query(A[i]); update(A[i]+1,1); } return cnt; } void sim(int op) { if (op == 1) { FOR(i,0,(1<<(N-1))-1){ swap(A[i],A[i+(1<<(N-1))]); } } else { int c[] = {0,0}; FOR(i,0,(1<<N)-1) tmp[i&1][c[i&1]++] = A[i]; FOR(i,0,(1<<(N-1))-1) A[i] = tmp[0][i]; FOR(i,0,(1<<(N-1))-1) A[i+(1<<(N-1))] = tmp[1][i]; } } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> N; FOR(i,0,(1<<N)-1){ cin >> org[i]; } n = (1<<N); nn = n>>1; int mininv = 1e9; vector<int> ans; FOR(s,0,n-1){ FOR(i,0,n-1) A[i] = org[i]; vector<int> ops; while (true) { int pos0 = -1; FOR(i,0,n-1) if (A[i] == s) pos0 = i; if (pos0 == 0) break; int op; if (pos0 < nn) op = 2; else op = 1; ops.push_back(op); sim(op); } int cur = inv(), mini = 0; FOR(i,1,N-1){ sim(2); int nw = inv(); if (nw < cur) { cur = nw; mini = i; } } if (cur < mininv) { mininv = cur; FOR(i,1,mini) ops.push_back(2); ans = ops; //TRACE(cur _ SZ(ops)); } if (N > 11) break; } cout << mininv << '\n'; for (int& x : ans) { cout << x; } }
#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...