제출 #309831

#제출 시각아이디문제언어결과실행 시간메모리
309831CaroLinda고대 책들 (IOI17_books)C++14
50 / 100
252 ms20308 KiB
#include "books.h"
#include <bits/stdc++.h>

#define debug printf
#define lp(i,a,b) for(int i = a ; i < b; i++)
#define pb push_back
#define ff first
#define ss second
#define mk make_pair
#define pii pair<int,int>
#define ll long long 
#define all(x) x.begin(),x.end()
#define sz(x) (int)(x.size())

const int MAX = 1e6+10 ;

using namespace std ;

//Tentando uma ideia (provavelmente vai dar errado mas vamos nessa)


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

	int n = sz(p) ;
	ll ans = 0LL ;

	lp(i,0,n) ans += (ll)(abs(p[i]-i)) ;

	int L = 0  ;
	int R = n-1 ;

	while(L < s && p[L] == L ) L++ ;
	while(R > s && p[R] == R) R-- ;

	vector<bool> vis( n, false ) ;
	vector<pii> intervalo(n, make_pair(-1,-1) ) ;

	for(int i = L ; i <= R ; i++ )
	{
		if(vis[i]) continue ;

		vector<int> List ;

		int x = i , l = i , r = i;
		while(!vis[x])
		{
			vis[x] = true ;
			List.push_back(x) ;
			
			l = min(l,x) ;
			r = max(r,x) ;

			x = p[x] ;
		}

		for(auto e : List ) intervalo[e] = make_pair(l,r) ;

	}

	int l = s , r = s ;
	int lmin = intervalo[s].ff, rmax = intervalo[s].ss ;
	ll lastTime = ans ;

	while( !(l <= L && r >= R) )
	{

		while( l > lmin || r < rmax )
		{

			if( l > lmin )
			{
				l-- ;

				if( intervalo[l].ff <= lmin && intervalo[l].ss >= rmax )
					lastTime = ans ;

				lmin = min( lmin , intervalo[l].ff ) ;
				rmax = max(rmax, intervalo[l].ss ) ;
			}

			if(r < rmax )
			{
				r++ ;

				if(intervalo[r].ff <= lmin && intervalo[r].ss >= rmax)
					lastTime = ans ;

				lmin = min(lmin, intervalo[r].ff );
				rmax = max(rmax , intervalo[r].ss ) ;
			}

		}

		//Agora custa

		if( l <= L && r >= R ) break ;

		if(l > L) lmin-- , ans++ ;
		if(r+1 < R ) rmax++ , ans++ ;

	}

	ans += ans - lastTime ;

	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...