Submission #335745

#TimeUsernameProblemLanguageResultExecution timeMemory
335745couplefireAncient Books (IOI17_books)C++17
50 / 100
412 ms74024 KiB
#include "books.h"
#include <bits/stdc++.h>
using namespace std;

long long minimum_walk(vector<int> p, int s) {
    int n = p.size();
    vector<bool> visited(n, 0);
    vector<vector<int>> cycles;
    long long ans = 0;
    for(int i = 0; i<n; i++) ans += abs(p[i]-i);
    for(int i = 0; i<n; i++){
        if(visited[p[i]]) continue;
        cycles.push_back({});
        int j = p[i];
        while(!visited[j]){
            visited[j] = 1;
            cycles.back().push_back(j);
            j = p[j];
        }
    }
    vector<int> del(n+1, 0);
    vector<int> add(n+1, 0);
    for(auto x : cycles){
        int mi = n, ma = -1;
        for(auto y : x){
            mi = min(mi, y);
            ma = max(ma, y);
        }
        add[mi]++;
        del[ma+1]++;
    }
    int cur = 0;
    int cnt = 0;
    for(int i = 0; i<=s; i++){
        cur -= del[i];
        if(cur == 0 && i != 0) cnt++;
        cur += add[i];
    }
    for(int i = s+1; i<n; i++){
        cur -= del[i];
        if(cur == 0) cnt++;
        cur += add[i];
    }
    for(int i = n-1; i>=s+1 && p[i] == i; i--) cnt--;
    for(int i = 0; i<s && p[i] == i; i++) cnt--;
	return ans+2ll*cnt;
}
#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...