Submission #335745

#TimeUsernameProblemLanguageResultExecution timeMemory
335745couplefireAncient Books (IOI17_books)C++17
50 / 100
412 ms74024 KiB
#include "books.h" #include <bits/stdc++.h> using namespace std; long long minimum_walk(vector<int> p, int s) { int n = p.size(); vector<bool> visited(n, 0); vector<vector<int>> cycles; long long ans = 0; for(int i = 0; i<n; i++) ans += abs(p[i]-i); for(int i = 0; i<n; i++){ if(visited[p[i]]) continue; cycles.push_back({}); int j = p[i]; while(!visited[j]){ visited[j] = 1; cycles.back().push_back(j); j = p[j]; } } vector<int> del(n+1, 0); vector<int> add(n+1, 0); for(auto x : cycles){ int mi = n, ma = -1; for(auto y : x){ mi = min(mi, y); ma = max(ma, y); } add[mi]++; del[ma+1]++; } int cur = 0; int cnt = 0; for(int i = 0; i<=s; i++){ cur -= del[i]; if(cur == 0 && i != 0) cnt++; cur += add[i]; } for(int i = s+1; i<n; i++){ cur -= del[i]; if(cur == 0) cnt++; cur += add[i]; } for(int i = n-1; i>=s+1 && p[i] == i; i--) cnt--; for(int i = 0; i<s && p[i] == i; i++) cnt--; return ans+2ll*cnt; }
#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...