Submission #423954

#TimeUsernameProblemLanguageResultExecution timeMemory
423954timmyfeng고대 책들 (IOI17_books)C++17
50 / 100
181 ms15180 KiB
#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) {
        	++cycles[left], --cycles[right];
            low = min(low, left), high = max(high, right);
        }
    }

    partial_sum(cycles, cycles + n, cycles);
    ans += 2 * count(cycles + low, cycles + high, 0);

    return ans;
}
#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...