이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 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... |