제출 #780599

#제출 시각아이디문제언어결과실행 시간메모리
780599CSQ31고대 책들 (IOI17_books)C++17
50 / 100
121 ms20348 KiB
#include "books.h"
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
#define sz(a) (int)(a.size())
#define all(a) a.begin(),a.end()
typedef long long int ll;
typedef pair<int,int> pii;
const int MAXN = 1e6+1;
int par[MAXN];
int find(int x){
	if(x==par[x])return x;
	return par[x] = find(par[x]);
}
ll minimum_walk(vector<int> p, int s) {
	int n = sz(p);
	ll ans = 0;
	for(int i=0;i<n;i++){
		ans+=abs(i-p[i]);
		par[i] = i;
	}
	for(int i=0;i<n;i++){
		if(i==p[i])continue;
		int mn = min(i,p[i]);
		int mx = max(i,p[i]);
		
		int j = mn;
		while(find(j)+1 <= mx){
			j = find(j);
			par[j] = j+1;
		}
	}
	vector<pii>lf,rg;
	pii md = {-1,-1};
	for(int i=0;i<n;i++){
		if(i==p[i])continue;
		int j = i;
		while(j+1<n && find(i) == find(j+1))j++;
		if(j<=s)lf.pb({i,j});
		else if(i>=s)rg.pb({i,j});
		else md = {i,j};
		i = j;
	}
	
	ll add = 0;
	if(md.fi != -1){
		add+=min(s-md.fi,md.se-s);
		lf.pb({md.fi,md.fi});
		rg.insert(rg.begin(),{md.se,md.se});
	}else{
		lf.pb({s,s});
		rg.insert(rg.begin(),{s,s});
	}
	//for(pii x:lf)cout<<x.fi<<" "<<x.se<<'\n';
	//cout<<add<<'\n';
	for(int i=0;i+1<sz(lf);i++)add+=lf[i+1].fi - lf[i].se;
	//cout<<add<<'\n';
	for(int i=0;i+1<sz(rg);i++)add+=rg[i+1].fi - rg[i].se;
	//cout<<add<<'\n';
	ans+=2*add;
	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...