Submission #542829

#TimeUsernameProblemLanguageResultExecution timeMemory
542829zggfAncient Books (IOI17_books)C++14
50 / 100
191 ms28800 KiB
#include "books.h"
#include <bits/stdc++.h>

using namespace std;

vector<int> parent, ranga;

int find(int x){
	if(parent[x]==-1) return x;
	parent[x] = find(parent[x]);
	return parent[x];
}

void join(int a, int b){
	a = find(a);
	b = find(b);
	if(a==b) return;
	if(ranga[a]>ranga[b]){
		parent[b] = a;
	}else if(ranga[b]>ranga[a]){
		parent[a] = b;
	}else{
		parent[b] = a;
		ranga[a]++;
	}
}

long long minimum_walk(std::vector<int> p, int s) {
	int n = p.size();
	vector<int> odw(n);
	parent.resize(n, -1);
	ranga.resize(n);
	long long wyn = 0;
	vector<pair<int, int>> inp;
	for(int i = 0; i < n; i++){
		int pt = i;
		if(!odw[pt]){
			if(p[pt]!=pt){
				int mini = 1e9;
				int maxi = -1e9;
				while(!odw[pt]){
					mini = min(mini, pt);
					maxi = max(maxi, pt);
					odw[pt] = true;
					wyn+=abs(p[pt]-pt);
					pt = p[pt];	
				}
				inp.push_back({mini, maxi});
			}else{
			       	odw[pt] = true;
			}
		}
	}
	inp.push_back({s, s});
	sort(inp.begin(), inp.end());
	int dal = 0;
	for(int i = 0; i < inp.size()-1; i++){
		dal = max(dal, inp[i].second);
		while(inp[i+1].first<dal){
			i++;
			dal = max(dal, inp[i].second);
			if(i==inp.size()-1) break;
		}
		if(i<inp.size()-1){
			wyn+=2*(inp[i+1].first-dal);	
		}
	}
	return wyn;
}

Compilation message (stderr)

books.cpp: In function 'long long int minimum_walk(std::vector<int>, int)':
books.cpp:57:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |  for(int i = 0; i < inp.size()-1; i++){
      |                 ~~^~~~~~~~~~~~~~
books.cpp:62:8: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |    if(i==inp.size()-1) break;
      |       ~^~~~~~~~~~~~~~
books.cpp:64:7: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   64 |   if(i<inp.size()-1){
      |      ~^~~~~~~~~~~~~
#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...