제출 #410969

#제출 시각아이디문제언어결과실행 시간메모리
410969Kevin_Zhang_TW고대 책들 (IOI17_books)C++17
50 / 100
129 ms14820 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define pb emplace_back #define AI(i) begin(i), end(i) template<class T> bool chmin(T &a, T b) { return b < a && (a = b, true); } template<class T> bool chmax(T &a, T b) { return a < b && (a = b, true); } #ifdef KEV #define DE(args...) kout("[ " + string(#args) + " ] = ", args) void kout() { cerr << endl; } template<class T, class ...U> void kout(T a, U ...b) { cerr << a << ' ', kout(b...); } void debug(auto l, auto r) { while (l != r) cerr << *l << " \n"[next(l)==r], ++l; } #else #define DE(...) 0 #define debug(...) 0 #endif #include "books.h" long long minimum_walk(std::vector<int> p, int s) { int n = p.size(); ll res = 0; for (int i = 0;i < n;++i) res += abs(i - p[i]); if (res == 0) return 0; int L = 0, R = n-1; while (p[L] == L) ++L; while (p[R] == R) --R; chmax(R, s), chmin(L, s); auto expand = [&](int &l, int &r) { int nl = min({p[l], p[r], l}), nr = max({p[l], p[r], r}); while (nl != l || nr != r) { while (nl < l) { --l; chmax(nr, p[l]); chmin(nl, p[l]); } while (nr > r) { ++r; chmax(nr, p[r]); chmin(nl, p[l]); } } }; int l = s, r = s; expand(l, r); while (l != L || r != R) { int costl = 0, costr = 0; int nl = l, nr = r; bool sig = false; { int sl = l, sr = r; while (sl > L && sr <= r) { expand(--sl, sr); costl += 2; } sig |= sr <= r; chmin(nl, sl); chmax(nr, sr); } { int sl = l, sr = r; while (sl >= l && sr < R) { expand(sl, ++sr); costl += 2; } if (sig) assert(sl >= l); if (sl >= l) { assert(sig); } chmin(nl, sl); chmax(nr, sr); } if (sig) res += costl + costr; else res += min(costl, costr); l = nl, r = nr; } 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...