이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define sz(x) (int) (x).size()
#define all(x) (x).begin(), (x).end()
#define show(x) cerr << #x << " is " << x << endl;
#define show2(x,y) cerr << #x << " is " << x << " " << #y << " is " << y << endl;
#define show3(x,y,z) cerr << #x << " is " << x << " " << #y << " is " << y << " " << #z << " is " << z << endl;
#define tern(cond, a, b) (cond ? a : b)
typedef long long lint;
typedef pair<lint,lint> ii;
vector<int> original;
vector<int> arr;
vector<int> nxt;
lint ans = 123123231232132LL;
lint res = 0;
int main(){
ios_base::sync_with_stdio(false); cin.tie(0);
int n; cin >> n;
int N = (1<<n);
original.resize(N);
for(int i = 0;i < N;i++) cin >> original[i];
for(int iter = 0;iter < n;iter++){
arr.clear();
for(int i = 0;i < N;i++) arr.push_back(original[i]);
res = 0;
for(lint gap = (1<<(n-1));gap > 0;gap >>= 1){
lint invcnt = 0;
lint total = 0;
for(int s = 0;s < N;s += 2*gap){
int m = s+gap, e = s+2*gap;
vector<int> R;
for(int i = m;i < e;i++) R.push_back(arr[i]);
sort(all(R));
for(int i = s;i < m;i++){
lint pos = lower_bound(all(R), arr[i]) - R.begin();
invcnt += pos;
}
total += gap*gap;
}
//show2(invcnt, total-invcnt);
if(total-invcnt < invcnt){
res += total-invcnt;
}
else{
res += invcnt;
}
}
//show(res);
ans = min(ans, res);
//for(int i = 0;i < N;i++) cerr << arr[i] << " "; cerr << endl;
nxt.clear();
for(int i = 0;i < N;i += 2) nxt.push_back(original[i]);
for(int i = 1;i < N;i += 2) nxt.push_back(original[i]);
swap(nxt, original);
}
cout << ans;
}
# | 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... |