제출 #566557

#제출 시각아이디문제언어결과실행 시간메모리
566557lorenzoferrari고대 책들 (IOI17_books)C++17
50 / 100
152 ms19860 KiB
#include <bits/stdc++.h> #include "books.h" using namespace std; using LL = long long; #ifdef LORENZO const int N = 1000; #else const int N = 1e6 + 42; #endif int t[2*N]; void upd(int l, int r) { for (l += N, r += N; l < r; l >>= 1, r >>= 1) { if (l & 1) t[l++] = 1; if (r & 1) t[--r] = 1; } } int qry(int p) { int ans = 0; for (p += N; p > 0; p >>= 1) { ans = max(ans, t[p]); } return ans == 0; } LL minimum_walk(vector<int> p, int s) { int n = p.size(); LL ans = 0; for (int i = 0; i < n; ++i) { ans += abs(i - p[i]); } int rl = s+1; int rr = s; vector<int> cyc(n, -1); for (int i = 0, c = 0; i < n; ++i) { if (cyc[i] != -1) continue; int ii = i, l = i, r = i; do { cyc[ii] = c; ii = p[ii]; l = min(l, ii); r = max(r, ii); } while (i != ii); ++c; if (l != r) { upd(l+1, r+1); rl = min(rl, r+1); rr = max(rr, l); } } for (int i = rl; i <= rr; ++i) { ans += 2 * qry(i); } return ans; }
#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...