제출 #814604

#제출 시각아이디문제언어결과실행 시간메모리
814604erray고대 책들 (IOI17_books)C++17
100 / 100
182 ms26724 KiB
#include "books.h" //author: erray #include <bits/stdc++.h> using namespace std; #ifdef DEBUG #include "/home/ioi/codes/debug.h" #else #define debug(...) (void) 37 #endif long long minimum_walk(std::vector<int> P, int s) { int N = int(P.size()); //assert(s == 0); long long res = 0; int start = 0, end = N - 1; while (start < N && P[start] == start) { ++start; } while (end >= 0 && P[end] == end) { --end; } if (start == N) { return 0; } //res += 2 * start; vector<int> upd(N); for (int i = 0; i < N; ++i) { int L = P[i], R = i; if (L > R) { swap(L, R); } upd[L] += 1; upd[R] -= 1; res += (R - L); } for (int i = 0; i < N - 1; ++i) { upd[i + 1] += upd[i]; } for (int i = start; i < end; ++i) { if (upd[i] == 0) { res += 2; } } debug(upd, res); vector<int> L(N, -1), R(N); for (int i = 0; i < N; ++i) { if (L[i] == -1) { int v = i; L[i] = R[i] = i; do { v = P[v]; L[i] = min(L[i], v); R[i] = max(R[i], v); } while (v != i); do { v = P[v]; L[v] = L[i]; R[v] = R[i]; } while (v != i); } } debug(start, end, res, L, R); if (s <= start) { res += (start - s) * 2; } else if (end <= s) { res += (s - end) * 2; } else { auto Expand = [&](int& l, int& r) { int go_l = min(L[l], L[r]); int go_r = max(R[l], R[r]); while (go_l < l || go_r > r) { while (go_l < l) { --l; go_l = min(L[l], go_l); go_r = max(R[l], go_r); } while (go_r > r) { ++r; go_l = min(L[r], go_l); go_r = max(R[r], go_r); } } }; int l = s, r = s; Expand(l, r); int add = 0; while (upd[r] != 0) { --l, ++r; ++add; Expand(l, r); } res += 2 * add; } 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...