Submission #293787

#TimeUsernameProblemLanguageResultExecution timeMemory
293787BruteforcemanAncient Books (IOI17_books)C++11
50 / 100
295 ms20828 KiB
#include "bits/stdc++.h"
#include "books.h"
using namespace std;

long long minimum_walk(std::vector<int> p, int s) {
  assert(s == 0);
  int n = p.size();
  long long ans = 0;
  vector <bool> vis (n, false);
  vector <pair <int, int>> range;
  for(int i = 0; i < n; i++) ans += abs(p[i] - i);
  for(int i = 0; i < n; i++) {
    if(vis[i] == true) continue;
    vector <int> cycle;
    int cur = i;
    do {
      vis[cur] = true;
      cycle.push_back(cur);
      cur = p[cur];
    } while(vis[cur] == false);
    range.emplace_back(*min_element(cycle.begin(), cycle.end()),
                       *max_element(cycle.begin(), cycle.end()));
  }
  vector <int> pre (n, 0); 
  for(auto i : range) {
    pre[i.second] -= 1;
    pre[i.first] += 1;
  }
  for(int i = 1; i < pre.size(); i++) pre[i] += pre[i - 1];
  ans += count(pre.begin(), pre.end(), 0) * 2;
  for(int i = pre.size() - 1; i >= s; i--) {
    if(pre[i] == 1) break;
    ans -= 2;
  }
  for(int i = 0; i < s; i++) {
    if(pre[i] == 1) break;
    ans -= 2;
  }
	return ans;
}

Compilation message (stderr)

books.cpp: In function 'long long int minimum_walk(std::vector<int>, int)':
books.cpp:29:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |   for(int i = 1; i < pre.size(); i++) pre[i] += pre[i - 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...