Submission #566343

#TimeUsernameProblemLanguageResultExecution timeMemory
566343sofapudenAncient Books (IOI17_books)C++14
12 / 100
1 ms340 KiB
#include "books.h"
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

ll minimum_walk(vector<int> p, int s) {
	ll su = 0;
	int mx = 0;
	int n = p.size();
	vector<int> vis(n,0);
	vector<int> cnt(n+1,0);
	ll ans = 0;
	int cn = 0;
	vector<vector<int>> gr(n+1);
	for(int i = 0; i < n; ++i){
		if(!vis[i]){
			cn++;
			while(!vis[i]){
				ans+=abs(i-p[i]);
				vis[i] = cn;
				cnt[cn]++;
				i = p[i];
			}
		}
	}
	int dif = 0;
	vector<int> cnt2(n+1,0);
	bool st = 0;
	int ls = 0;
	pair<int,int> inter;
	for(int i = 0; i < n; ++i){
		if(i == s)st = 1, mx = i;
		if(!cnt2[vis[i]]++)dif++;
		if(cnt2[vis[i]] == cnt[vis[i]])dif--;
		if(!dif){
			if(i >= s && ls <= s)inter = {ls,i};
			ls = i+1;
			ans+=2*st;
		}
		else mx = i+1, st = 1;
	}
	vector<pair<int,int>> segs(n+1,{n,0});
	for(int i = 0; i < n; ++i){
		segs[vis[i]].first = min(segs[vis[i]].first,i);
		segs[vis[i]].second = max(segs[vis[i]].second,i);
	}
	int l = s, r = s;
	queue<int> Q;
	Q.push(s);
	while(Q.size()){
		auto x = Q.front();
		Q.pop();
		for(int i = segs[vis[x]].first; i < l; ++i)Q.push(i);
		for(int i = r+1; i <= segs[vis[x]].second; ++i)Q.push(i);
		l = min(l,segs[vis[x]].first);
		r = max(r,segs[vis[x]].second);
	}
	ans-=2*(make_pair(l,r)!=segs[vis[s]]);
	return ans-2*(n-mx);
}

Compilation message (stderr)

books.cpp: In function 'll minimum_walk(std::vector<int>, int)':
books.cpp:9:5: warning: unused variable 'su' [-Wunused-variable]
    9 |  ll su = 0;
      |     ^~
#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...