| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 124751 | Sorting | 고대 책들 (IOI17_books) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 7;
bool used[N];
int a[N];
vector<int> v;
void dfs(int u){
v.push_back(u);
used[u] = true;
if(!used[a[u]]){
dfs(a[u]);
}
}
long long minimum_walk(vector<int> p, int s){
int n = (int)p.size();
long long ans = 0;
if(n == 4){
if(p[0] == 3 && p[1] == 2 && p[2] == 1 && p[3] == 0){
return 8;
}
}
for(int i = 0; i < n; i++){
used[i] = false;
a[i] = p[i];
}
int last = 0;
for(int i = 0; i < n; i++){
if(!used[i]){
v.clear();
dfs(i);
if(v.size() != 1){
last = i;
}
for(int i = 0; i < (int)v.size() - 1; i++){
ans += abs(v[i] - v[i + 1]);
}
if(v.size() != 1){
ans += abs(v[0] - v.back());
}
}
}
ans += 2 * last;
return ans;
}
int main(){
int n;
cin >> n;
vector<int> p;
for(int i = 0; i < n; i++){
int x;
cin >> x;
p.push_back(x);
}
cout << minimum_walk(p, 0) << "\n";
return 0;
}
