Submission #833721

#TimeUsernameProblemLanguageResultExecution timeMemory
833721JosiaAncient Books (IOI17_books)C++17
50 / 100
168 ms39344 KiB
#include "books.h" #include <bits/stdc++.h> using namespace std; #define int int64_t vector<int> p; int s; int n; int res; vector<int> cycles; pair<int, int> getCycle(int v, int ind) { if (cycles[v] != -1) return {-1, -1}; pair<int, int> range = {1e9, -1e9}; while (cycles[v] == -1) { cycles[v] = ind; range.first = min(range.first, v); range.second = max(range.second, v); res += abs(p[v]-v); v = p[v]; } return range; } long long minimum_walk(vector<signed> _p, signed _s) { s = _s; n = _p.size(); p.resize(n); for (int i = 0; i<n; i++) p[i] = _p[i]; cycles.assign(n, -1); res = 0; vector<pair<int, int>> ranges; for (int i = 0; i<n; i++) { ranges.push_back(getCycle(i, i)); if (ranges.back().first == ranges.back().second) ranges.pop_back(); } ranges.push_back({s, s}); sort(ranges.begin(), ranges.end()); set<int> active = {ranges[0].second}; for (int i = 1; i<(int)ranges.size(); i++) { res += 2*max((int)0, ranges[i].first-*active.rbegin()); active.insert(ranges[i].second); } return res; }
#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...