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 = 1000000;
bool visited[N];
int cycles[N];
long long minimum_walk(vector<int> perm, int start) {
int n = perm.size();
long long ans = 0;
int low = start, high = start;
for (int i = 0; i < n; ++i) {
ans += abs(perm[i] - i);
int left = i, right = i, j = i;
while (!visited[j]) {
left = min(left, j), right = max(right, j);
visited[j] = true;
j = perm[j];
}
if (left != right) {
low = min(low, left), high = max(high, right);
++cycles[left], --cycles[right];
}
}
partial_sum(cycles, cycles + n, cycles);
ans += 2 * count(cycles + low, cycles + high, 0);
if (cycles[start] > 0) {
int left = start, right = start;
while (perm[left] == left) {
--left;
}
while (perm[right] == right) {
++right;
}
ans += 2 * min(start - left, right - start);
}
return 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... |