제출 #123174

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

#define pb push_back
#define mp make_pair
#define inside sl<=l&&r<=sr
#define outside r<sl||sr<l
#define inf 1000000009
using namespace std;
typedef long long ll;

int n;
vector<int> arr;
vector<ll> numara;
vector<ll> beg;
vector<ll> en;
vector<pair<int, pair<int, int> > > edges;
int num = 0;
vector<pair<ll, ll> > minler;
vector<int> dsu;

int find(int node){
	if (dsu[node] == node) return node;
	int ans = find(dsu[node]);
	return dsu[node] = ans;
}

void unionn(int node1, int node2){
	node1 = find(node1);
	node2 = find(node2);
	if (node1 == node2) return;
	dsu[node1] = node2;
}

ll minimum_walk(vector<int> p, int s){
	arr = p;
	n = p.size();
	numara.resize(n);
	while (p[n-1] == n-1 && n > 1) n--;
	if (n == 1) return 0;
	int strt = 0;
	while (p[strt] == strt) strt++;
	ll ans = 0;
	for (int i = 0; i < n; i++) numara[i] = -1;
	for (int i = 0; i < n; i++){
		if (numara[i] == -1 && p[i] != i){
			int node = i;
			int lmost = node;
			int rmost = node;
			while (numara[node] == -1){
				numara[node] = num;
				ans += abs(p[node] - node);
				node = p[node];
				lmost = min(lmost, node);
				rmost = max(rmost, node);
			}
			beg.pb(lmost);
			en.pb(rmost);
			num++;
			//ans += (2*(rmost-lmost));
		}
	}
	
	//for (int i = 0; i < n; i++) cout << numara[i] << " "; cout << endl;
	
	vector<list<int> > begs(n);
	vector<list<int> > ens(n);
	for (int i = 0; i < num; i++){
		begs[beg[i]].pb(i);
		ens[en[i]].pb(i);
	}
	set<int> open;
	for (int i = strt; i < n; i++){
		for (list<int>::iterator it = begs[i].begin(); it != begs[i].end(); ++it){
			open.insert(*it);
		}
		for (list<int>::iterator it = ens[i].begin(); it != ens[i].end(); ++it){
			open.erase(open.find(*it));
		}
		if (open.size() == 0) ans += 2;
	}
	ans -= 2;
	
	int mindist = inf;
	for (int i = s; i < n; i++){
		if (numara[i] != -1){
			mindist = min(mindist, i-s);
			break;
		}
	}
	for (int i = s; i >= 0; i--){
		if (numara[i] != -1){
			mindist = min(mindist, s-i);
			break;
		}
	}
	ans += 2*mindist;
	
	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...