Submission #293847

#TimeUsernameProblemLanguageResultExecution timeMemory
293847BruteforcemanAncient Books (IOI17_books)C++11
50 / 100
236 ms20572 KiB
#include "bits/stdc++.h" #include "books.h" using namespace std; long long minimum_walk(std::vector<int> p, int s) { 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; } int opt = INT_MAX; for(int i = 0; i < n; i++) { if(p[i] != i) { opt = min(opt, abs(i - s)); } } if(opt < INT_MAX) { if(s > 0 && pre[s - 1] > 0) { if(pre[s] > 0) { ans += 2 * opt; } } } return ans; }

Compilation message (stderr)

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