Submission #1184878

#TimeUsernameProblemLanguageResultExecution timeMemory
1184878hamzabcWiring (IOI17_wiring)C++20
7 / 100
163 ms327680 KiB
#include "wiring.h" #include <bits/stdc++.h> using namespace std; std::vector<int> R, B; vector<pair<int, bool>> C; // false -> red, true -> blue std::vector<int> C2O; // next different color index vector<vector<long long>> memoiazion; int A, N, K; // N -> red, K -> blue long long dp(int a, int nk, int mk){ if (a == N + K){ return 0; } int combined = nk - mk + K; if (memoiazion[a][combined] != -1){ return memoiazion[a][combined]; } if (C[a].second && mk){ memoiazion[a][combined] = dp(a + 1, nk, mk - 1); return memoiazion[a][combined]; } if (!C[a].second && nk){ memoiazion[a][combined] = dp(a + 1, nk - 1, mk); return memoiazion[a][combined]; } if (C[a].second){ if (C2O[a] == 0) memoiazion[a][combined] = dp(a + 1, nk, mk) + R[C2O[a]] - C[a].first; else if (C2O[a] == N) memoiazion[a][combined] = dp(a + 1, nk, mk) + C[a].first - R[C2O[a] - 1]; else memoiazion[a][combined] = dp(a + 1, nk, mk) + min(R[C2O[a]] - C[a].first, C[a].first - R[C2O[a] - 1]); if (C2O[a] + nk < N){ memoiazion[a][combined] = min(memoiazion[a][combined], dp(a + 1, nk + 1, mk) + R[C2O[a] + nk] - C[a].first); } return memoiazion[a][combined]; } if (C2O[a] == 0) memoiazion[a][combined] = dp(a + 1, nk, mk) + B[C2O[a]] - C[a].first; else if (C2O[a] == K) memoiazion[a][combined] = dp(a + 1, nk, mk) + C[a].first - B[C2O[a] - 1]; else memoiazion[a][combined] = dp(a + 1, nk, mk) + min(B[C2O[a]] - C[a].first, C[a].first - B[C2O[a] - 1]); if (C2O[a] + mk < K){ memoiazion[a][combined] = min(memoiazion[a][combined], dp(a + 1, nk, mk + 1) + B[C2O[a] + mk] - C[a].first); } return memoiazion[a][combined]; } long long min_total_length(std::vector<int> r, std::vector<int> b) { N = r.size(); K = b.size(); R.resize(N); B.resize(K); C2O.resize(N + K); C.resize(N + K); for (int i = 0; i < N; i++){ R[i] = r[i]; } for (int i = 0; i < K; i++){ B[i] = b[i]; } int j = 0; for (int i = 0; i < K + N; i++){ if (j == N){ C[i].first = B[i - j]; C[i].second = true; C2O[i] = j; }else if (i - j == K){ C[i].first = R[j]; C[i].second = false; C2O[i] = i - j; j++; }else if (B[i - j] < R[j]){ C[i].first = B[i - j]; C[i].second = true; C2O[i] = j; }else{ C[i].first = R[j]; C[i].second = false; C2O[i] = i - j; j++; } } memoiazion.resize(N + K, vector<long long>(N + K + 1, -1)); return dp(0, 0, 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...