Submission #642103

#TimeUsernameProblemLanguageResultExecution timeMemory
642103piOOEAncient Books (IOI17_books)C++17
50 / 100
130 ms18764 KiB
#include <bits/stdc++.h>
#include "books.h"

using namespace std;
using ll = long long;

long long minimum_walk(std::vector<int> p, int s) {
    if (is_sorted(p.begin(), p.end())) {
        return 0;
    }
    int n = p.size();
    vector<int> inv(n);
    for (int i = 0; i < n; ++i) {
        inv[p[i]] = i;
    }
    ll ans = 0;
    for (int j = 0; j < n; ++j) {
        ans += abs(p[j] - inv[p[j]]);
    }
    int L = 0, R = n;
    while (p[L] == L) ++L;
    while (p[R - 1] == R - 1) --R;
    if (s < L || s >= R) {
        int i = 0;
        int mx = -1;
        for (; i < n; ++i) {
            if (is_sorted(p.begin() + i, p.end())) break;
            if (i && mx < i) {
                ans += 2;
            }
            mx = max(mx, p[i]);
        }
        return ans;
    } else {
        int mn = n;
        for (int j = s; j < R; ++j) mn = min(mn, p[j]);
        for (int j = s - 1; j >= L; --j) {
            if (j < mn) {
                ans += 2;
            }
            mn = min(mn, p[j]);
        }
        int mx = -1;
        for (int j = L; j <= s; ++j) {
            mx = max(mx, p[j]);
        }
        for (int j = s + 1; j < R; ++j) {
            if (j > mx) ans += 2;
            mx = max(mx, p[j]);
        }
        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...