|
| 1 | +```cpp |
| 2 | + |
| 3 | +#include <iostream> |
| 4 | +#include <queue> |
| 5 | +#include <tuple> |
| 6 | +#include <algorithm> |
| 7 | +using namespace std; |
| 8 | +using ll = long long; |
| 9 | + |
| 10 | +ll N; |
| 11 | +ll S[3]{}; |
| 12 | +ll A[101][3]{}; |
| 13 | +ll dp[101][101][101][3][2]{}; |
| 14 | + |
| 15 | +// 시계 (b -> a) |
| 16 | +ll cal1(ll a, ll b) { return b >= a ? b - a : b + N - a; } |
| 17 | +// 반시계 (b -> a) |
| 18 | +ll cal2(ll a, ll b) { return a >= b ? a - b : a + N - b; } |
| 19 | + |
| 20 | +int main() |
| 21 | +{ |
| 22 | + cin.tie(0)->sync_with_stdio(0); |
| 23 | + |
| 24 | + cin >> N; |
| 25 | + int K = N / 3; |
| 26 | + for (int i = 0; i < 3; i++) { |
| 27 | + cin >> S[i]; |
| 28 | + for (int j = 1; j <= S[i]; j++) { |
| 29 | + cin >> A[j][i]; |
| 30 | + if (i == 1) A[j][i] = (A[j][i] + 2 * K) % N; |
| 31 | + else if (i == 2) A[j][i] = (A[j][i] + K) % N; |
| 32 | + if (A[j][i] == 0) A[j][i] = N; |
| 33 | + } |
| 34 | + } |
| 35 | + |
| 36 | + dp[1][0][0][0][0] = cal1(A[1][0], 1); |
| 37 | + dp[1][0][0][0][1] = cal2(A[1][0], 1); |
| 38 | + dp[0][1][0][1][0] = cal1(A[1][1], 1); |
| 39 | + dp[0][1][0][1][1] = cal2(A[1][1], 1); |
| 40 | + dp[0][0][1][2][0] = cal1(A[1][2], 1); |
| 41 | + dp[0][0][1][2][1] = cal2(A[1][2], 1); |
| 42 | + |
| 43 | + for (int a = 0; a <= S[0]; a++) for (int b = 0; b <= S[1]; b++) for (int c = 0; c <= S[2]; c++) { |
| 44 | + if (a + b + c <= 1) continue; |
| 45 | + ll &res1 = dp[a][b][c][0][0]; |
| 46 | + ll &res2 = dp[a][b][c][0][1]; |
| 47 | + ll &res3 = dp[a][b][c][1][0]; |
| 48 | + ll &res4 = dp[a][b][c][1][1]; |
| 49 | + ll &res5 = dp[a][b][c][2][0]; |
| 50 | + ll &res6 = dp[a][b][c][2][1]; |
| 51 | + res1 = 1e18; |
| 52 | + res2 = 1e18; |
| 53 | + res3 = 1e18; |
| 54 | + res4 = 1e18; |
| 55 | + res5 = 1e18; |
| 56 | + res6 = 1e18; |
| 57 | + |
| 58 | + if (a > 0) { |
| 59 | + ll t1 = min(dp[a - 1][b][c][0][0], dp[a - 1][b][c][0][1]); |
| 60 | + ll t2 = min(dp[a - 1][b][c][1][0], dp[a - 1][b][c][1][1]); |
| 61 | + ll t3 = min(dp[a - 1][b][c][2][0], dp[a - 1][b][c][2][1]); |
| 62 | + |
| 63 | + ll v1 = 1e18; |
| 64 | + if (a - 1 > 0) res1 = min(res1, t1 + cal1(A[a][0], A[a - 1][0])); |
| 65 | + if (b > 0) res1 = min(res1, t2 + cal1(A[a][0], A[b][1])); |
| 66 | + if (c > 0) res1 = min(res1, t3 + cal1(A[a][0], A[c][2])); |
| 67 | + ll v2 = 1e18; |
| 68 | + if (a - 1 > 0) res2 = min(res2, t1 + cal2(A[a][0], A[a - 1][0])); |
| 69 | + if (b > 0) res2 = min(res2, t2 + cal2(A[a][0], A[b][1])); |
| 70 | + if (c > 0) res2 = min(res2, t3 + cal2(A[a][0], A[c][2])); |
| 71 | + } |
| 72 | + if (b > 0) { |
| 73 | + ll t1 = min(dp[a][b - 1][c][0][0], dp[a][b - 1][c][0][1]); |
| 74 | + ll t2 = min(dp[a][b - 1][c][1][0], dp[a][b - 1][c][1][1]); |
| 75 | + ll t3 = min(dp[a][b - 1][c][2][0], dp[a][b - 1][c][2][1]); |
| 76 | + |
| 77 | + ll v1 = 1e18; |
| 78 | + if (a > 0) res3 = min(res3, t1 + cal1(A[b][1], A[a][0])); |
| 79 | + if (b - 1 > 0) res3 = min(res3, t2 + cal1(A[b][1], A[b - 1][1])); |
| 80 | + if (c > 0) res3 = min(res3, t3 + cal1(A[b][1], A[c][2])); |
| 81 | + ll v2 = 1e18; |
| 82 | + if (a > 0) res4 = min(res4, t1 + cal2(A[b][1], A[a][0])); |
| 83 | + if (b - 1 > 0) res4 = min(res4, t2 + cal2(A[b][1], A[b - 1][1])); |
| 84 | + if (c > 0) res4 = min(res4, t3 + cal2(A[b][1], A[c][2])); |
| 85 | + } |
| 86 | + if (c > 0) { |
| 87 | + ll t1 = min(dp[a][b][c - 1][0][0], dp[a][b][c - 1][0][1]); |
| 88 | + ll t2 = min(dp[a][b][c - 1][1][0], dp[a][b][c - 1][1][1]); |
| 89 | + ll t3 = min(dp[a][b][c - 1][2][0], dp[a][b][c - 1][2][1]); |
| 90 | + |
| 91 | + ll v1 = 1e18; |
| 92 | + if (a > 0) res5 = min(res5, t1 + cal1(A[c][2], A[a][0])); |
| 93 | + if (b > 0) res5 = min(res5, t2 + cal1(A[c][2], A[b][1])); |
| 94 | + if (c - 1 > 0) res5 = min(res5, t3 + cal1(A[c][2], A[c - 1][2])); |
| 95 | + ll v2 = 1e18; |
| 96 | + if (a > 0) res6 = min(res6, t1 + cal2(A[c][2], A[a][0])); |
| 97 | + if (b > 0) res6 = min(res6, t2 + cal2(A[c][2], A[b][1])); |
| 98 | + if (c - 1 > 0) res6 = min(res6, t3 + cal2(A[c][2], A[c - 1][2])); |
| 99 | + } |
| 100 | + |
| 101 | + } |
| 102 | + |
| 103 | + ll ans = 2e18; |
| 104 | + for (int i = 0; i < 3; i++) for (int j = 0; j < 2; j++) ans = min(ans, dp[S[0]][S[1]][S[2]][i][j]); |
| 105 | + cout << ans; |
| 106 | + |
| 107 | +} |
| 108 | + |
| 109 | +``` |
0 commit comments