Submission #596685

#TimeUsernameProblemLanguageResultExecution timeMemory
596685farhan132Ancient Books (IOI17_books)C++17
50 / 100
136 ms39912 KiB
#include "books.h"
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
typedef pair<ll , ll> ii;
 
#define ff first
#define ss second
#define pb push_back
#define in insert

long long minimum_walk(std::vector<int> p, int s) {

	 ll n = p.size();

	 vector < ll > vis(n, 0);
	 ll ans = 0;
	 while(n > 0 && p[n-1] == n-1){
	 	n--;
	 }
	 if(n == 0) return 0;
	 ll l = 0;
	 while(p[l] == l) l++;
	 ll r = n - 1; ll mx = l;

	 if(s < l){
	 	ans += 2*abs(l - s); s = l;
	 }
	 if(s > r){
	 	ans += 2*abs(r - s); s = r;
	 }
	 vector < ll > P(n + 2, -1), dist(n + 2, 0);
	 vector < ll > st; st.pb(l); P[l] = l; dist[l] = l;
	 for(ll i = l; i <= r; i++){
	 	if(vis[i]) continue;
	 	ll c = i; 
	 	ll _mx = c;
	 	while(!vis[c]){
	 		vis[c] = 1;
	 		_mx = max(_mx, c);
	 		ans += abs(p[c] - c); c = p[c];
	 	}
	 	if(mx < i){
	 		P[i] = i;
	 		dist[i] = _mx;
	 		st.pb(i);
	 	}else{
	 		if(i != l) P[i] = P[i - 1];
	 		dist[P[i]] = max(dist[P[i]], _mx);
	 	}
	 	mx = max(mx, _mx);
	 }
	 ans += 2*st.size() - 2;
	 for(auto L : st){
	 	if(L <= s && s <= dist[L]){
	 		//ans += 2 * min(abs(s - L), abs(s - dist[L]));
	 	}
	 }
	 
	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...