Submission #767065

#TimeUsernameProblemLanguageResultExecution timeMemory
767065danikoynovAncient Books (IOI17_books)C++14
42 / 100
111 ms16264 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]; vector < int > st[maxn]; ll distance(int l, int r, int i, int j) { if (i <= l && j >= r) { int mx = 1e9; for (int idx : st[used[i]]) { if (idx >= l && idx <= r) { mx = 0; break; } mx = min(mx, abs(idx - l)); mx = min(mx, abs(idx - r)); } return mx * 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(); if (n > 1000) { int cnt = 0; ll mx = 0, ans = 0; int to = 0; for (int i = 0; i < n; i ++) { if (p[i] == i) continue; ans = ans + (ll)abs(i - p[i]); ///cout << ans << endl; if (!used[i]) { if (to < i) mx = mx + i - to; int v = p[i]; while(v != i) { to = max(to, v); used[v] = 1; v = p[v]; } to = max(to, v); used[v] = 1; } } return ans + 2 * mx; } 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; r[cnt] = i; st[cnt].push_back(i); while(v != i) { st[cnt].push_back(v); 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; /**cout << "-------------" << endl; for (int i = 1; i <= cnt; i ++) cout << l[i] << " " << r[i] << endl; cout << "-------------" << endl;*/ 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; ///cout << i << " " << j << " " << dp[i][j] << endl; 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 p = 1; p <= cnt; p ++) idx.push_back(p); for (int cur : idx) { int newl = min((ll)i, l[cur]); int newr = max((ll)j, r[cur]); if (dp[newl][newr] > dp[i][j] + distance(i, j, l[cur], r[cur])) { dp[newl][newr] = dp[i][j] + distance(i, j, l[cur], r[cur]); ///cout << "to " << newl << " " << newr << endl; } ///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 << dp[lf][rf] << endl; ///cout << lf << " " << rf << endl; return ans + dp[lf][rf]; }

Compilation message (stderr)

books.cpp: In function 'long long int minimum_walk(std::vector<int>, int)':
books.cpp:46:9: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   46 |         if (p[i] == i)
      |         ^~
books.cpp:48:13: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   48 |             ans = ans + (ll)abs(i - p[i]);
      |             ^~~
books.cpp:41:13: warning: unused variable 'cnt' [-Wunused-variable]
   41 |         int cnt = 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...