Submission #1184927

#TimeUsernameProblemLanguageResultExecution timeMemory
1184927hamzabcWiring (IOI17_wiring)C++20
13 / 100
27 ms17480 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 std::vector<int> C2N; // current color index vector<int> B2C, R2C; vector<long long> Cclose; long long *prefixCclose; vector<long long> memoiazion; int A, N, K; // N -> red, K -> blue long long dp(int a){ if (a >= N + K){ return 0; } if (memoiazion[a] != -1){ return memoiazion[a]; } if (C[a].second){ memoiazion[a] = prefixCclose[N + K - 1] - prefixCclose[a - 1]; long long int add = 0; for (int i = C2O[a], j = C2N[a]; i < N && j < K; i++, j++){ add += -Cclose[B2C[j]] - Cclose[R2C[i]] + abs(C[R2C[i]].first - C[B2C[j]].first); if (memoiazion[a] < dp(max(R2C[i], B2C[j]) + 1) + prefixCclose[max(R2C[i], B2C[j])] - prefixCclose[a - 1] + add) break; memoiazion[a] = dp(max(R2C[i], B2C[j]) + 1) + prefixCclose[max(R2C[i], B2C[j])] - prefixCclose[a - 1] + add; } return memoiazion[a]; } memoiazion[a] = prefixCclose[N + K - 1] - prefixCclose[a - 1]; long long int add = 0; for (int i = C2O[a], j = C2N[a]; i < K && j < N; i++, j++){ add += -Cclose[R2C[j]] - Cclose[B2C[i]] + abs(C[B2C[i]].first - C[R2C[j]].first); if (memoiazion[a] < dp(max(B2C[i], R2C[j]) + 1) + prefixCclose[max(B2C[i], R2C[j])] - prefixCclose[a - 1] + add) break; memoiazion[a] = dp(max(B2C[i], R2C[j]) + 1) + prefixCclose[max(B2C[i], R2C[j])] - prefixCclose[a - 1] + add; } return memoiazion[a]; } 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); R2C.resize(N); B2C.resize(K); C2O.resize(N + K); C2N.resize(N + K); C.resize(N + K); Cclose.resize(N + K); prefixCclose = new long long[N + K + 1]; prefixCclose[0] = 0; prefixCclose++; // index -1 = 0 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]; B2C[i - j] = i; C[i].second = true; C2O[i] = j; C2N[i] = i - j; }else if (i - j == K){ C[i].first = R[j]; R2C[j] = i; C[i].second = false; C2O[i] = i - j; C2N[i] = j; j++; }else if (B[i - j] < R[j]){ C[i].first = B[i - j]; B2C[i - j] = i; C[i].second = true; C2O[i] = j; C2N[i] = i - j; }else{ C[i].first = R[j]; R2C[j] = i; C[i].second = false; C2O[i] = i - j; C2N[i] = j; j++; } } for (int i = 0; i < N + K; i++){ if (C[i].second){ if (C2O[i] == 0) Cclose[i] = R[C2O[i]] - C[i].first; else if (C2O[i] == N) Cclose[i] = C[i].first - R[C2O[i] - 1]; else Cclose[i] = min(R[C2O[i]] - C[i].first, C[i].first - R[C2O[i] - 1]); }else{ if (C2O[i] == 0) Cclose[i] = B[C2O[i]] - C[i].first; else if (C2O[i] == K) Cclose[i] = C[i].first - B[C2O[i] - 1]; else Cclose[i] = min(B[C2O[i]] - C[i].first, C[i].first - B[C2O[i] - 1]); } } for (int i = 0; i < N + K; i++){ prefixCclose[i] = prefixCclose[i - 1] + Cclose[i]; } memoiazion.resize(N + K, -1); return dp(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...