Submission #370962

#TimeUsernameProblemLanguageResultExecution timeMemory
370962KoDAncient Books (IOI17_books)C++17
50 / 100
157 ms19052 KiB
#include <bits/stdc++.h>
#include "books.h"

template <class T>
using Vec = std::vector<T>;

long long minimum_walk(Vec<int> p, int s) {
	assert(s == 0);
	const int n = (int) p.size();
	Vec<bool> done(n);
	long long ret = 0;
	Vec<int> add(n);
	int rightmost = 0;
	for (int i = 0; i < n; ++i) {
		ret += std::abs(p[i] - i);
		if (!done[i]) {
			if (i != p[i]) {
				rightmost = i;
			}
			int l = n, r = -1;
			int u = i;
			while (!done[u]) {
				l = std::min(l, u);
				r = std::max(r, u);
				done[u] = true;
				u = p[u];
			}
			add[l] += 1;
			add[r] -= 1;
		}
	}
	for (int i = 1; i < n; ++i) {
		add[i] += add[i - 1];
	}
	while (rightmost > 0) {
		rightmost -= 1;
		ret += 2 * (add[rightmost] == 0 ? 1 : 0);
	}
	return ret;
}
#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...