Submission #1321894

#TimeUsernameProblemLanguageResultExecution timeMemory
1321894nikdAncient Books (IOI17_books)C++20
0 / 100
0 ms332 KiB
#include "books.h" #include <bits/stdc++.h> using namespace std; long long minimum_walk(std::vector<int> p, int s) { int n = p.size(); vector<int> l; vector<int> r; int cyc = 0; int sol = 0; vector<bool> vis(n, 0); for(int i = 0; i<n; i++){ if(vis[i]) continue; cyc++; l.push_back(i); r.push_back(i); int v = i; while(!vis[v]){ vis[v] = 1; l.back() = min(l.back(), v); r.back() = max(r.back(), v); sol += abs(p[v]-v); v = p[v]; } } // cerr << cyc << '\n'; // cerr << sol << '\n'; int l_curr = s; int r_curr = s; vector<int> left_c; vector<int> right_c; for(int i = 0; i<cyc; i++){ if(l[i] <= s && r[i] >= i){ l_curr = min(l_curr, l[i]); r_curr = max(r_curr, r[i]); } else if(r[i] < s) left_c.push_back(i); else right_c.push_back(i); } sort(left_c.begin(), left_c.end(), [&](int a, int b){return r[a] > r[b];}); sort(right_c.begin(), right_c.end(), [&](int a, int b){return l[a] < l[b];}); for(int i: left_c){ if(r[i] < l_curr) sol += 2*(l_curr-r[i]); //2*1 l_curr = min(l_curr, l[i]); } for(int i: right_c){ if(l[i] > r_curr) sol += 2*(-r_curr+l[i]); r_curr = max(r_curr, r[i]); } return sol; }
#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...