Submission #109596

#TimeUsernameProblemLanguageResultExecution timeMemory
109596JustasZAncient Books (IOI17_books)C++14
70 / 100
2043 ms117368 KiB
#include "books.h" #include <bits/stdc++.h> #define pb push_back #define x first #define y second #define all(a) a.begin(), a.end() #define sz(a) (int)a.size() #define rd() abs((int)rng()) using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; const int maxn = 1e6 + 100; const int mod = 1e9 + 7; mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); int n, s, val[maxn], nxt, L[maxn], R[maxn], fr, to; ll base, add; vector<int>p; map<pii, int>dp; ll solve(int l, int r) { if(dp.count(pii(l, r))) return dp[pii(l, r)]; int cur_l = l, cur_r = r; int i = l, j = r; while(i >= cur_l || j <= cur_r) { if(i >= cur_l) { cur_l = min(cur_l, L[val[i]]); cur_r = max(cur_r, R[val[i]]); --i; } if(j <= cur_r) { cur_l = min(cur_l, L[val[j]]); cur_r = max(cur_r, R[val[j]]); j++; } } if(cur_l <= fr && cur_r >= to) return 0; ll ret = 1e18; if(cur_l > fr) ret = min(ret, solve(cur_l - 1, cur_r)); if(cur_r < to) ret = min(ret, solve(cur_l, cur_r + 1)); return dp[pii(l, r)] = 2 + ret; } ll minimum_walk(vector<int>perm, int S) { p = perm; s = S; n = sz(p); for(int i = 1; i <= n; i++) L[i] = mod, R[i] = -mod; to = n - 1, fr = 0; while(to >= 0 && p[to] == to) --to; while(fr < n && p[fr] == fr) ++fr; if(fr > to) return 0; for(int i = 0; i < n; i++) { if(val[i] == 0) { int col = ++nxt, cur = i; while(val[cur] == 0) { val[cur] = col; L[col] = min(L[col], cur); R[col] = max(R[col], cur); base += abs(p[cur] - cur); cur = p[cur]; } } } return base + solve(s, s); } /*int main() { ios_base::sync_with_stdio(false), cin.tie(0); vector<int>perm; ifstream fin("in.txt"); int n, s; fin >> n >> s; perm.resize(n); for(int i = 0; i < n; i++) fin >> perm[i]; cout << minimum_walk(perm, s) << endl; return 0; }*/
#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...