Submission #832282

#TimeUsernameProblemLanguageResultExecution timeMemory
832282MadokaMagicaFan고대 책들 (IOI17_books)C++14
12 / 100
1 ms468 KiB
#include "bits/stdc++.h" using namespace std; using ll = long long; #define sz(v) ((int)v.size()) #define pb push_back const int N = 1e6; bitset<N> v; ll minimum_walk(vector<int> p, int s) { /* assumes s = 0 */ ll ans = 0; int n = sz(p); v = 0; for (int i = 0; i < n; ++i) ans += (ll)abs(i - p[i]); vector<array<ll,2>> rn, newr; for (int i = 0; i < n; ++i) { int l, r, x; l = r = i; if (v[i]) continue; x = p[i]; while (!v[x]) { v[x] = 1; l = min(l, x); r = max(r, x); x = p[x]; } if (l != r) rn.pb({l,r}); } if (sz(rn) == 0) return 0; sort(rn.begin(), rn.end()); newr.pb(rn.front()); for (int i = 1; i < sz(rn); ++i) { if (rn[i][0] > newr.back()[1]) { ans += rn[i][0] - newr.back()[1]; newr.pb(rn[i]); } else { newr.back()[1] = max(newr.back()[1], rn[i][1]); } } return ans + 2ll * newr.front()[0]; } #ifdef ONPC int main() { int n, s; cin >> n >> s; vector<int> p(n); for(int i = 0; i < n; ++i) cin >> p[i]; cout << minimum_walk(p, s) << endl; } #endif
#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...