Submission #1082958

#TimeUsernameProblemLanguageResultExecution timeMemory
1082958happypotatoAncient Books (IOI17_books)C++17
50 / 100
133 ms38848 KiB
#include "books.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define pii pair<int, int> #define ff first #define ss second #define pb push_back long long minimum_walk(vector<int> p, int s) { vector<int> ori = p; int n = (int)(p.size()); ll ans = 0; vector<pii> range(n); for (int i = 0; i < n; i++) { if (p[i] == -1) continue; int cur = i; vector<int> seq = {cur}; while (p[cur] != i) { cur = p[cur]; seq.pb(cur); } pii get = {i, i}; for (int x : seq) { get.ff = min(get.ff, x); get.ss = max(get.ss, x); } for (int i = 0; i < (int)(seq.size()); i++) { ans += abs(seq[(i + 1) % (int)(seq.size())] - seq[i]); range[seq[i]] = get; p[seq[i]] = -1; } } vector<int> bruh = {-1}; int maxi = 0; for (int i = 0; i < n; i++) { maxi = max(maxi, ori[i]); if (maxi == i) bruh.pb(i); } deque<pii> dq; for (int i = 1; i < (int)(bruh.size()); i++) { dq.push_back({bruh[i - 1] + 1, bruh[i]}); } while (!dq.empty()) { pii cur = dq.front(); if (cur.ff <= s && s <= cur.ss) break; if (cur.ff < cur.ss) break; dq.pop_front(); } while (!dq.empty()) { pii cur = dq.back(); if (cur.ff <= s && s <= cur.ss) break; if (cur.ff < cur.ss) break; dq.pop_back(); } ans += ((int)(dq.size()) - 1) * 2; if (s == 0) return ans; pii tar; while (!dq.empty()) { pii cur = dq.front(); dq.pop_front(); if (cur.ff <= s && s <= cur.ss) { tar = cur; break; } } assert(n <= 1000); vector<vector<int>> dp(n); for (int i = 0; i < n; i++) dp[i].resize(n, 1e9); dp[s][s] = 0; queue<pii> q; q.push({s, s}); while (!q.empty()) { pii cur = q.front(); q.pop(); if (cur.ff > 0) { pii nrange = {range[cur.ff - 1].ff, max(cur.ss, range[cur.ff - 1].ss)}; if (dp[nrange.ff][nrange.ss] > dp[cur.ff][cur.ss] + 1) { dp[nrange.ff][nrange.ss] = dp[cur.ff][cur.ss] + 1; q.push(nrange); } } if (cur.ss < n - 1) { pii nrange = {min(cur.ff, range[cur.ss + 1].ff), range[cur.ss + 1].ss}; if (dp[nrange.ff][nrange.ss] > dp[cur.ff][cur.ss] + 1) { dp[nrange.ff][nrange.ss] = dp[cur.ff][cur.ss] + 1; q.push(nrange); } } } ans += dp[tar.ff][tar.ss] * 2; return ans; }
#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...