Submission #121992

#TimeUsernameProblemLanguageResultExecution timeMemory
121992nvmdava고대 책들 (IOI17_books)C++17
50 / 100
221 ms16112 KiB
#include "books.h"
#include <bits/stdc++.h>
using namespace std;
bool in[1000005];
vector<pair<int, int> > cyc, tmp;
int mn, mx;
long long res;
void dfs(int i, vector<int>& p){
	if(in[i]) return;
	in[i] = 1;
	mx = max(mx, i);
	mn = min(mn, i);
	dfs(p[i], p);
}
 
long long minimum_walk(std::vector<int> p, int s) {
	for(int i = 0; i < p.size(); i++){
		res += abs(p[i] - i);
		if(in[i]) continue;
		mn = i;
		mx = i;
		dfs(i, p);
		if(mn != mx)tmp.push_back({mn , mx});
	}
	if(tmp.empty()) return 0;
	sort(tmp.begin(), tmp.end());
	mx = -1;
	bool in = 0;
	for(auto& x : tmp){
		if(mx < x.first){
			if(!cyc.empty()){
				res += 2 * (x.first - mx);	
			}
			cyc.push_back(x);
		}
		if(s >= x.first && s <= x.second) in = 1;
		mx = max(mx, x.second);
	}
	if(s < cyc[0].first) res += 2 * (cyc[0].first - s);
	else if(s > cyc.back().second) res += 2 * (s - cyc.back().second);
	else if(in == 0){
		int l = s, r = s;
		while(l >= 0 && ::in[l] == 0) l--;
		while(r != p.size() && ::in[r] == 0) r++;
		
		if(l == -1) res += (r - s) * 2;
		else if(r == p.size()) res += (s - l) * 2;
		else {
			res += min(s - l, r - s) * 2;
		}
	}
	return res;
}

Compilation message (stderr)

books.cpp: In function 'long long int minimum_walk(std::vector<int>, int)':
books.cpp:17:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < p.size(); i++){
                 ~~^~~~~~~~~~
books.cpp:44:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   while(r != p.size() && ::in[r] == 0) r++;
         ~~^~~~~~~~~~~
books.cpp:47:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   else if(r == p.size()) res += (s - l) * 2;
           ~~^~~~~~~~~~~
#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...