Submission #288803

#TimeUsernameProblemLanguageResultExecution timeMemory
288803luciocfWiring (IOI17_wiring)C++14
0 / 100
282 ms262144 KiB
#include <bits/stdc++.h> #include "wiring.h" #define ff first #define ss second using namespace std; typedef pair<int, int> pii; typedef long long ll; const int maxn = 210; const ll inf = 1e18+10; int n, m; pii a[maxn]; ll dp[2*maxn][maxn][maxn]; ll solve(int i, int r, int b) { if (r > n || b > m) return inf; if (i == n+m+1) { if (!r && !b) return 0; return inf; } if (dp[i][r][b] != -1) return dp[i][r][b]; ll ans = inf; if (a[i].ss == 0) { ans = min(ans, solve(i+1, r+1, b) - 1ll*a[i].ff); if (b) ans = min(ans, 1ll*a[i].ff + solve(i+1, r, b-1)); ans = min(ans, solve(i, r+1, b) - 1ll*a[i].ff); if (b) ans = min(ans, 1ll*a[i].ff + solve(i, r, b-1)); } else { ans = min(ans, solve(i+1, r, b+1) - 1ll*a[i].ff); if (r) ans = min(ans, 1ll*a[i].ff + solve(i+1, r-1, b)); ans = min(ans, solve(i, r, b+1) - 1ll*a[i].ff); if (r) ans = min(ans, 1ll*a[i].ff + solve(i, r-1, b)); } return dp[i][r][b] = ans; } ll min_total_length(vector<int> r, vector<int> b) { n = r.size(), m = b.size(); if (n <= 200 && m <= 200) { int aux = 0; for (auto i: r) a[++aux] = {i, 0}; for (auto i: b) a[++aux] = {i, 1}; sort(a+1, a+n+m+1); memset(dp, -1, sizeof dp); return solve(1, 0, 0); } ll ans = 0; if (m > n) { for (int i = m-1; i >= n; i--) ans += 1ll*(b[i]-r[n-1]); for (int i = n-1; i >= 0; i--) ans += 1ll*(b[i]-r[i]); } else if (m < n) { for (int i = 0; i < n-m; i++) ans += 1ll*(b[0]-r[i]); for (int i = n-m; i < n; i++) ans += 1ll*(b[i-(n-m)]-r[i]); } else { for (int i = 0; i < n; i++) ans += 1ll*(b[i]-r[i]); } 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...