Submission #293024

#TimeUsernameProblemLanguageResultExecution timeMemory
293024amoo_safar고대 책들 (IOI17_books)C++17
42 / 100
178 ms18240 KiB
#include "books.h" #include <bits/stdc++.h> #define pb push_back #define F first #define S second #define all(x) x.begin(), x.end() using namespace std; typedef pair<int, int> pii; typedef long long ll; const int N = 1e3 + 10; int mk[N]; int L[N], R[N]; int mn[N][N], mx[N][N]; ll dp[N][N]; ll minimum_walk(vector<int> p, int s) { int n = p.size(); ll ans = 0; ll near = n; for(int i = 0; i < n; i++){ if(p[i] != i){ ans += abs(p[i] - i); near = min(near, (ll) abs(s - i)); } else { mk[i] = 1; R[i] = i; L[i] = i; } } int com = 0; vector<pii> seg; for(int i = 0; i < n; i++){ if(mk[i]) continue; com ++; vector<int> vis; int nw = i; while(!mk[nw]){ mk[nw] = 1; vis.pb(nw); nw = p[nw]; } sort(all(vis)); seg.pb({vis[0], vis.back()}); for(auto x : vis) L[x] = vis[0]; for(auto x : vis) R[x] = vis.back(); } if(com == 0) return 0; for(int i = 0; i < n; i++) mn[i][i] = L[i]; for(int i = 0; i < n; i++) mx[i][i] = R[i]; for(int ln = 1; ln < n; ln ++){ for(int i = 0; i + ln < n; i++){ int j = i + ln; mn[i][j] = min(mn[i][j - 1], mn[i + 1][j]); mx[i][j] = max(mx[i][j - 1], mx[i + 1][j]); } } if(ans == 0) return 0; int st = 0, en = n - 1; while(p[st] == st) st ++; while(p[en] == en) en --; ll Inf = 1e18; for(int ln = n - 1; ln >= 0; ln--){ for(int i = 0; i + ln < n; i++){ int j = i + ln; if(i <= st && en <= j) dp[i][j] = 0; else if(mn[i][j] != i || mx[i][j] != j){ dp[i][j] = dp[mn[i][j]][mx[i][j]]; } else { dp[i][j] = 2 + min(i ? dp[i - 1][j] : Inf, j + 1 < n ? dp[i][j + 1] : Inf); } } } return ans + dp[s][s]; }
#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...