제출 #846077

#제출 시각아이디문제언어결과실행 시간메모리
846077PiokemonCheerleaders (info1cup20_cheerleaders)C++17
100 / 100
573 ms16376 KiB
#include <bits/stdc++.h> using namespace std; typedef long long int ll; constexpr int K = 17; constexpr int N = (1<<K); int a[N+9]; int b[N+9]; vector<vector<int>> seg[K+5]; ll zwy,rev; void dziel(vector<int> &poz, int k){ vector<int> one,zero; one.clear();zero.clear(); for (int x:poz){ if (a[x]&(1<<k)){ one.push_back(x); rev += zero.size(); } else{ zero.push_back(x); zwy += one.size(); } } if (k>0){ if (one.size()>1)seg[k-1].push_back(one); if (zero.size()>1)seg[k-1].push_back(zero); } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll n,k; cin >> k; n = (1<<k); if (k==0){ cout << "0\n"; cout << "222\n"; return 0; } vector<int> temp; for (int x=0;x<n;x++){ cin >> b[x]; a[b[x]] =x; temp.push_back(x); } pair<int,int> best; ll inw=n*n; for (int rot=0;rot<=k-1;rot++){ for (int x=0;x<=k-1;x++) seg[x].clear(); seg[k-1].push_back(temp); ll ksor=0,odp=0; for (int z=k-1;z>=0;z--){ zwy=0; rev=0; for (vector<int> &y:seg[z]){ dziel(y,z); } if (zwy<rev) odp+=zwy; else{ odp+=rev; ksor+=(1<<z); } } if (odp<inw){ inw = odp; best = {rot,ksor}; } for (int x=0;x<n;x++){ ll temp = a[x]%2; a[x] = a[x]/2; a[x] += (temp<<(k-1)); } } //cout << best.first << ' ' << best.second << '\n'; cout << inw << '\n'; for (int x=0;x<best.first;x++) cout << '2'; for (int x=0;x<k;x++){ cout << '2'; if (best.second & (1<<x)) cout << '1'; } cout << '\n'; }
#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...