제출 #337666

#제출 시각아이디문제언어결과실행 시간메모리
337666pit4h고대 책들 (IOI17_books)C++14
50 / 100
146 ms34540 KiB
#include "books.h"
#include "bits/stdc++.h"
using namespace std;
using ll = long long;
ll solve(vector<int> p, bool force) {
	int n = p.size(), s = 0, t = n-1;

	while(!force && p[s]==s) s++;
	while(p[t]==t) t--;

	ll ans = 0;

	vector<int> cnt(n), L(n), R(n);
	for(int i=s; i<=t; ++i) {
		if(p[i] > i) cnt[i]++, cnt[p[i]]--;
	}
	int delta = 0;
	for(int i=s; i<=t; ++i) {
		delta += cnt[i];
		L[i] = delta;
	}

	cnt = vector<int>(n, 0);
	for(int i=s; i<=t; ++i) {
		if(p[i] < i) {
			cnt[i-1]++;
			if(p[i]-1>=0) cnt[p[i]-1]--;
		}
	}
	delta = 0;
	for(int i=t; i>=s; --i) {
		delta += cnt[i];
		R[i] = delta;
	}
	
	for(int i=s; i<t; ++i) {
		ans += max(2, max(L[i], R[i])*2);
	}
	return ans;
}
ll minimum_walk(vector<int> p, int s) {
	int n = p.size();
	if(s==0 || p[s]!=s) {
		return solve(p, (s==0));
	}
	ll ans = 1e18+1;
	vector<int> q = p;
	for(int i=0; i<n; ++i) {
		if(i==s) continue;
		q[i] = s;
		q[s] = p[i];
		ans = min(ans, solve(q, 0));
		q[i] = p[i];
		q[s] = p[s];
	}
	return ans;
}
#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...