Submission #1030378

#TimeUsernameProblemLanguageResultExecution timeMemory
1030378shiomusubi496Ancient Books (IOI17_books)C++17
42 / 100
583 ms1048576 KiB
#include "books.h" #include <bits/stdc++.h> #define rep(i, n) for (int i = 0; i < (int)(n); ++i) #define rep2(i, a, b) for (int i = (int)(a); i < (int)(b); ++i) #define rrep(i, n) for (int i = (int)(n) - 1; i >= 0; --i) #define rrep2(i, a, b) for (int i = (int)(b) - 1; i >= (int)(a); --i) #define all(v) begin(v), end(v) #define rall(v) rbegin(v), rend(v) using namespace std; using ll = long long; constexpr ll inf = 1e18; template<class T, class U> bool chmin(T& a, const U& b) { return a > b ? a = b, true : false; } template<class T, class U> bool chmax(T& a, const U& b) { return a < b ? a = b, true : false; } template<class M> class SparseTable { using T = typename M::T; int n; vector<vector<T>> dat; public: SparseTable(vector<T> a) { n = a.size(); int h = __lg(n + 1) + 1; dat.assign(h + 1, vector<T>(n, M::id())); rep (i, n) dat[0][i] = a[i]; rep (i, h) rep (j, n - (1 << i)) { dat[i + 1][j] = M::op(dat[i][j], dat[i][j + (1 << i)]); } } T prod(int l, int r) { assert(0 <= l && l <= r && r <= n); int b = __lg(r - l); return M::op(dat[b][l], dat[b][r - (1 << b)]); } }; struct Min { using T = ll; static T op(T a, T b) { return min(a, b); } static T id() { return inf; } }; struct Max { using T = ll; static T op(T a, T b) { return max(a, b); } static T id() { return -inf; } }; long long minimum_walk(std::vector<int> p, int s) { int n = p.size(); if (is_sorted(all(p))) return 0; ll ans = 0; { while (p.back() == n - 1) { if (s == n - 1) { --s; ans += 2; } p.pop_back(); --n; } reverse(all(p)); rep (i, n) p[i] = n - 1 - p[i]; s = n - 1 - s; while (p.back() == n - 1) { if (s == n - 1) { --s; ans += 2; } p.pop_back(); --n; } reverse(all(p)); rep (i, n) p[i] = n - 1 - p[i]; s = n - 1 - s; } rep (i, n) ans += abs(p[i] - i); vector<ll> mns(n), mxs(n); { vector<bool> seen(n); rep (i, n) { if (seen[i]) continue; int j = i; int mx = 0; do { seen[j] = true; chmax(mx, j); j = p[j]; } while (i != j); j = i; do { mns[j] = i; mxs[j] = mx; j = p[j]; } while (i != j); } } SparseTable<Min> st1(mns); SparseTable<Max> st2(mxs); vector<vector<ll>> dp(n + 1, vector<ll>(n + 1, inf)); dp[s][s] = 0; rep (len, n) { rep (l, n + 1 - len) { int r = l + len; if (dp[l][r] == inf) continue; { int l2 = st1.prod(l, r + 1); int r2 = st2.prod(l, r + 1); chmin(dp[l2][r2], dp[l][r]); } if (l != 0) chmin(dp[mns[l - 1]][max<int>(r, mxs[l - 1])], dp[l][r] + 1); if (r != n - 1) chmin(dp[min<int>(l, mns[r + 1])][mxs[r + 1]], dp[l][r] + 1); } } return ans + dp[0][n - 1] * 2; }
#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...