Submission #767040

#TimeUsernameProblemLanguageResultExecution timeMemory
767040danikoynovAncient Books (IOI17_books)C++14
12 / 100
6 ms8252 KiB
#include "books.h" #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e3 + 10; const ll inf = 1e18; ll used[maxn], l[maxn], r[maxn], n, dp[maxn][maxn]; int bef[maxn], aft[maxn]; ll distance(int l, int r, int i, int j) { if (i <= l && j >= r) return min(l - i, j - r) * 2; if (i > r) return (i - r) * 2; if (j < l) return (l - j) * 2; return 0; } long long minimum_walk(vector<int> p, int s) { n = p.size(); int cnt = 0; ll ans = 0; for (int i = 0; i < n; i ++) { ans = ans + abs(p[i] - i); if (p[i] == i) continue; if (used[i]) continue; cnt ++; used[i] = cnt; int v = p[i]; l[cnt] = i; while(v != i) { used[v] = cnt; r[cnt] = max(r[cnt], (ll)v); v = p[v]; } } bef[0] = used[0]; for (int i = 1; i < n; i ++) { bef[i] = bef[i - 1]; if (used[i] != 0) bef[i] = used[i]; } aft[n - 1] = used[n - 1]; for (int i = n - 2; i >= 0; i --) { aft[i] = aft[i + 1]; if (used[i] != 0) aft[i] = used[i]; } for (int i = 0; i < n; i ++) for (int j = 0; j < n; j ++) dp[i][j] = inf; dp[s][s] = 0; if (used[s] != 0) dp[l[used[s]]][r[used[s]]] = 0; for (int len = 1; len <= n; len ++) { for (int i = 0; i < n - len + 1; i ++) { int j = i + len - 1; if (dp[i][j] == inf) continue; vector < int > idx; if (i != 0 && bef[i - 1] != 0) idx.push_back(bef[i - 1]); if (j != n - 1 && aft[j + 1] != 0) idx.push_back(aft[j + 1]); for (int cur : idx) { int newl = min((ll)i, l[cur]); int newr = max((ll)j, r[cur]); dp[newl][newr] = min(dp[newl][newr], dp[i][j] + distance(i, j, l[cur], r[cur])); } } } int lf = 0; int rf = n - 1; while(lf < s && used[lf] == 0) lf ++; while(rf > s && used[rf] == 0) rf --; ///cout << lf << " " << rf << endl; return ans + dp[lf][rf]; }
#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...