Submission #81151

#TimeUsernameProblemLanguageResultExecution timeMemory
81151Tuhi고대 책들 (IOI17_books)C++14
0 / 100
2 ms640 KiB
#include <bits/stdc++.h>

using namespace std;
const int Nmax = 1e6 + 10;

int n, s, l, r, p[Nmax];

bool ordered(vector<int> a) {
    for(int i = 0; i < n - 1; ++i) {
        if (a[i] > a[i + 1]) return false;
    }
    return true;
}

int solve_1(vector<int> p, int pos) {
    int l = 0, r = n - 1, res = 0;
    while(!ordered(p)) {
        while(p[r] == r) --r;
        while(p[l] == l) ++l;
        for( ; pos < r; ++pos) {
            if (p[pos + 1] < p[pos]) swap(p[pos + 1], p[pos]);
            ++res;
        }
        if (ordered(p)) break;
        for( ; pos > l; --pos) {
            if (p[pos - 1] > p[pos]) swap(p[pos - 1], p[pos]);
            ++res;
        }
    }
    return res + abs(pos - s);
}

int solve_2(vector<int> p, int pos) {
    int l = 0, r = n - 1, res = 0;
    while(!ordered(p)) {
        while(p[r] == r) --r;
        while(p[l] == l) ++l;
        for( ; pos > l; --pos) {
            if (p[pos - 1] > p[pos]) swap(p[pos - 1], p[pos]);
            ++res;
        }
        if (ordered(p)) break;
        for( ; pos < r; ++pos) {
            if (p[pos + 1] < p[pos]) swap(p[pos + 1], p[pos]);
            ++res;
        }
    }
    return res + abs(pos - s);
}

int64_t minimum_walk(vector<int> a, int s) {
    n = a.size();
    int tmp1 = solve_1(a, s), tmp2 = solve_2(a, s);
    return min(tmp1, tmp2);
}
#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...