Submission #73695

#TimeUsernameProblemLanguageResultExecution timeMemory
73695aquablitz11Ancient Books (IOI17_books)C++14
50 / 100
292 ms12464 KiB
#include <bits/stdc++.h>
#include "books.h"
using namespace std;

using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using plpii = pair<ll, pii>;

const int N = 1e6+10;
const ll INF = 1e9;

int qs[N];

ll minimum_walk(vector<int> p, int s)
{
    int n = p.size();
    bool ok = true;
    for (int i = 0; i < n; ++i) if (p[i] != i) {
        ok = false;
        break;
    }
    if (ok) return 0;
    ll dist = 0;
    for (int i = 0; i < n; ++i) {
        if (p[i] == -1) continue;
        if (p[i] == i) continue;
        int u = i;
        while (p[u] != -1) {
            int v = p[u];
            dist += abs(u-v);
            p[u] = -1;
            qs[min(u, v)] += 1;
            qs[max(u, v)] -= 1;
            u = v;
        }
    }
    int mn = INF;
    int last = -1;
    p[s] = -1;
    for (int i = 0; i < n; ++i) {
        if (i > 0) qs[i] += qs[i-1];
        if (last != -1 && p[i] == -1) {
            if (last <= s && s <= i)
                mn = 0;
            dist += 2*(i-last);
            last = -1;
        }
        if (qs[i] == 0 && p[i] == -1) {
            last = i;
        }
        if (qs[i] == 0 && (i == 0 || qs[i-1] > 0))
            mn = min(mn, abs(s-i));
        if (qs[i] > 0 && (i == 0 || qs[i-1] == 0))
            mn = min(mn, abs(s-i));
    }
    dist += 2*mn;

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