제출 #1181541

#제출 시각아이디문제언어결과실행 시간메모리
1181541HappyCapybara고대 책들 (IOI17_books)C++17
50 / 100
86 ms10428 KiB
#include "books.h"
#include<bits/stdc++.h>
using namespace std;

#define ll long long

ll minimum_walk(vector<int> p, int s){
	int n = p.size();
	ll res = 0;
	vector<pair<int,int>> cc;
	vector<bool> seen(n, false);
	int lm = -1;
	for (int i=0; i<n; i++){
		if (p[i] != i) lm = i;
		if (seen[i]) continue;
		seen[i] = true;
		if (p[i] == i) continue;
		int l = i, r = i;
		res += abs(p[i]-i);
		int cur = p[i];
		seen[cur] = true;
		l = min(l, cur);
		r = max(r, cur);
		while (cur != i){
			res += abs(p[cur]-cur);
			cur = p[cur];
			seen[cur] = true;
			l = min(l, cur);
			r = max(r, cur);
		}
		cc.push_back({l, r});
	}
	//cout << res << endl;
	sort(cc.begin(), cc.end());
	//for (auto [l, r] : cc) cout << l << " " << r << endl;
	int cur = -1, rb = 0;
	//cout << lm << endl;
	for (int i=0; i<lm; i++){
		while (cur+1 < cc.size() && cc[cur+1].first <= i){
			cur++;
			rb = max(rb, cc[cur].second);
		}
		//cout << i << " " << rb << " " << cur << endl;
		if (rb <= i) res += 2;
	}
	return res;
}
#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...