제출 #68031

#제출 시각아이디문제언어결과실행 시간메모리
68031KLPPAncient Books (IOI17_books)C++14
70 / 100
2053 ms104732 KiB
#include "books.h"
#include<iostream>
#include<vector>
#include<queue>
#include<map>
using namespace std;
typedef long long lld;
typedef pair<int,int> state;
typedef std::map<state,lld>::iterator mi;
int arr[1000000];
int n;
int maxa,maxb;
map<state,lld>DP;
lld computevalue(int i, int j){
	//cout<<i<<" "<<j<<endl;
	if(i<=maxa && maxb<=j)return 0;
	mi it=DP.find(state(i,j));
	if(it!=DP.end())return it->second;
	int start=i;
	int end=j;
	int ps=start;
	int pe=end;
	while(pe<=end){
		while(ps>=start){
			start=min(start,arr[ps]);
			end=max(end,arr[ps]);
			ps--;
		}
		start=min(start,arr[pe]);
		end=max(end,arr[pe]);
		pe++;
	}
	lld ans=1000000000000000000;
	if(start<=maxa && maxb<=end){
		DP[state(i,j)]=0;
		return 0;
	}
	if(start>maxa){
		ans=min(ans,computevalue(start-1,end)+2);
	}
	if(end<maxb){
		ans=min(ans,computevalue(start,end+1)+2);
	}
	DP[state(i,j)]=ans;
	return ans;
}
lld abs(lld x){
	if(x>0)return x;
	return -x;
}
long long minimum_walk(std::vector<int> p, int s) {
	n=p.size();
	for(int i=0;i<n;i++){
		arr[i]=p[i];
	}
	maxa=n;
	for(int i=0;i<n;i++){
		if(p[i]!=i){
			maxa=i;
			i=n;
		}
	}
	maxb=-1;
	for(int i=n-1;i>-1;i--){
		if(p[i]!=i){
			maxb=i;
			i=-1;
		}
	}
	
	//cout<<maxa<<" "<<maxb<<endl;
	lld ans=0;
	for(int i=0;i<n;i++)ans+=abs(p[i]-i);
	//cout<<ans<<endl;
	ans+=computevalue(s,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...