Submission #1227119

#TimeUsernameProblemLanguageResultExecution timeMemory
1227119chaeryeongRope (JOI17_rope)C++20
0 / 100
2595 ms320 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 1; int n, m, c[N], mn[N]; void solve () { cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> c[i]; } for (int i = 1; i <= m; i++) { mn[i] = 1e9; } //Updates of the form: // - sum[ == i][ == j] += x // - sum[ == i][ != j] += x // - sum[ != i][ == j] += x // - sum[ != i][ != j] += x //and same for delta if (n % 2 == 1) { /* for (int i = 1; i <= m; i++) { for (int j = 1; j <= m; j++) { int sum = 0; int delta = 1e9; for (int k = 1; k < n; k += 2) { sum += min((c[k] != i) + (c[k + 1] != i), (c[k] != j) + (c[k + 1] != j)); delta = min(delta, (c[k] != i) + (c[k + 1] != i) - (c[k] != j) - (c[k + 1] != j)); } sum += min(c[n] != i, c[n] != j); delta = min(delta, (c[n] != i) - (c[n] != j)); delta = max(delta, 0); mn[i] = min(mn[i], sum); } }*/ vector <vector <vector <int>>> sum(m + 1, vector <vector <int>> (m + 1, vector <int> (4))); vector <vector <vector <int>>> delta(m + 1, vector <vector <int>> (m + 1, vector <int> (4))); for (int i = 1; i <= m; i++) { for (int j = 1; j <= m; j++) { for (int k = 0; k < 4; k++) { delta[i][j][k] = 1e9; } } } auto insert_sum = [&] (int k, int i, int j, int x) -> void { sum[i][j][k] += x; }; auto insert_delta = [&] (int k, int i, int j, int x) -> void { delta[i][j][k] = min(delta[i][j][k], max(x, 0)); }; for (int i = 1; i < n; i += 2) { if (c[i] == c[i + 1]) { insert_sum(0, c[i], c[i], 0); insert_delta(0, c[i], c[i], 0); insert_sum(1, c[i], c[i], 0); insert_delta(1, c[i], c[i], -2); insert_sum(2, c[i], c[i], 0); insert_delta(2, c[i], c[i], 2); insert_sum(3, c[i], c[i], 2); insert_delta(3, c[i], c[i], 0); } else { insert_sum(0, c[i], c[i + 1], 1); insert_delta(0, c[i], c[i + 1], 0); insert_sum(1, c[i], c[i + 1], 1); insert_delta(1, c[i], c[i + 1], -1); insert_sum(2, c[i], c[i + 1], 1); insert_delta(2, c[i], c[i + 1], 1); insert_sum(3, c[i], c[i + 1], 2); insert_delta(3, c[i], c[i + 1], 0); } } insert_sum(0, c[n], c[n], 0); insert_delta(0, c[n], c[n], 0); insert_sum(1, c[n], c[n], 0); insert_delta(1, c[n], c[n], -1); insert_sum(2, c[n], c[n], 0); insert_delta(2, c[n], c[n], 1); insert_sum(3, c[n], c[n], 1); insert_delta(3, c[n], c[n], 0); for (int i = 1; i <= m; i++) { for (int j = 1; j <= m; j++) { int s = sum[i][j][0]; for (int k = 1; k <= m; j++) { if (j != k) { s += sum[i][k][1]; } if (i != k) { s += sum[k][j][2]; } } for (int k = 1; k <= m; k++) { for (int l = 1; l <= m; l++) { if (k != i && l != j) { s += sum[k][l][3]; } } } int d = delta[i][j][0]; for (int k = 1; k <= m; j++) { if (j != k) { d = min(d, delta[i][k][1]); } if (i != k) { d = min(d, delta[k][j][2]); } } for (int k = 1; k <= m; k++) { for (int l = 1; l <= m; l++) { if (k != i && l != j) { d = min(d, delta[k][l][3]); } } } mn[i] = min(mn[i], s + d); } } } if (n % 2 == 1) { for (int i = 1; i <= m; i++) { for (int j = 1; j <= m; j++) { int sum = 0; int delta = 1e9; for (int k = 2; k <= n; k += 2) { sum += min((c[k] != i) + (c[k + 1] != i), (c[k] != j) + (c[k + 1] != j)); delta = min(delta, (c[k] != i) + (c[k + 1] != i) - (c[k] != j) - (c[k + 1] != j)); } sum += min(c[1] != i, c[1] != j); delta = min(delta, (c[1] != i) - (c[1] != j)); delta = max(delta, 0); mn[i] = min(mn[i], sum + delta); } } } if (n % 2 == 0) { for (int i = 1; i <= m; i++) { for (int j = 1; j <= m; j++) { int sum = 0; int delta = 1e9; for (int k = 2; k < n; k += 2) { sum += min((c[k] != i) + (c[k + 1] != i), (c[k] != j) + (c[k + 1] != j)); delta = min(delta, (c[k] != i) + (c[k + 1] != i) - (c[k] != j) - (c[k + 1] != j)); } sum += min(c[n] != i, c[n] != j); sum += min(c[1] != i, c[1] != j); delta = min(delta, (c[1] != i) - (c[1] != j)); delta = min(delta, (c[n] != i) - (c[n] != j)); delta = max(delta, 0); mn[i] = min(mn[i], sum + delta); } } } if (n % 2 == 0) { for (int i = 1; i <= m; i++) { for (int j = 1; j <= m; j++) { int sum = 0; int delta = 1e9; for (int k = 1; k <= n; k += 2) { sum += min((c[k] != i) + (c[k + 1] != i), (c[k] != j) + (c[k + 1] != j)); delta = min(delta, (c[k] != i) + (c[k + 1] != i) - (c[k] != j) - (c[k + 1] != j)); } delta = max(delta, 0); mn[i] = min(mn[i], sum + delta); } } } for (int i = 1; i <= m; i++) { cout << mn[i] << '\n'; } } signed main () { ios::sync_with_stdio(0); cin.tie(0); int tc = 1; //cin >> tc; while (tc--) solve(); }
#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...