Submission #832288

#TimeUsernameProblemLanguageResultExecution timeMemory
832288MadokaMagicaFanAncient Books (IOI17_books)C++14
50 / 100
105 ms24624 KiB
#include "bits/stdc++.h"
using namespace std;
using ll = long long;
#define sz(v) ((int)v.size())
#define pb push_back

const int N = 1e6;
bitset<N> v;

ll minimum_walk(vector<int> p, int s) {
	/* assumes s = 0 */
	ll ans = 0;
	int n = sz(p);
	v = 0;
	for (int i = 0; i < n; ++i)
		ans += (ll)abs(i - p[i]);

	vector<array<ll,2>> rn, newr;
	for (int i = 0; i < n; ++i) {
		int l, r, x;
		l = r = i;
		if (v[i]) continue;
		x = i;
		while (!v[x]) {
			v[x] = 1;
			l = min(l, x);
			r = max(r, x);
			x = p[x];
		}
		if (l != r)
			rn.pb({l,r});
	}

	if (sz(rn) == 0) return 0;

	sort(rn.begin(), rn.end());
	newr.pb(rn.front());
	for (int i = 1; i < sz(rn); ++i) {
		if (rn[i][0] > newr.back()[1]) {
			ans += 2ll*(rn[i][0] - newr.back()[1]);
			newr.pb(rn[i]);
		} else {
			newr.back()[1] = max(newr.back()[1], rn[i][1]);
		}
	}


	return ans + 2ll * newr.front()[0];
}


#ifdef ONPC
int main() {
	int n, s;
	cin >> n >> s;
	vector<int> p(n);
	for(int i = 0; i < n; ++i)
		cin >> p[i];

	cout << minimum_walk(p, s) << endl;
}
#endif
#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...