Submission #1227452

#TimeUsernameProblemLanguageResultExecution timeMemory
1227452chaeryeongRope (JOI17_rope)C++20
100 / 100
1617 ms93460 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 1; int n, m, c[N], mn[N]; vector <int> occ[N]; #define mid ((l + r) >> 1) int tree[N << 2], leaf[N]; void init (int l, int r, int node) { if (l == r) { leaf[l] = node; } else { init(l, mid, 2 * node); init(mid + 1, r, 2 * node + 1); } } void update (int x, int y) { int u = leaf[x]; tree[u] += y; while (u > 1) { u >>= 1; tree[u] = max(tree[2 * u], tree[2 * u + 1]); } } void solve () { cin >> n >> m; if (m == 1) { cout << 0 << '\n'; return; } for (int i = 1; i <= n; i++) { cin >> c[i]; occ[c[i]].push_back(i); } for (int i = 1; i <= m; i++) { mn[i] = 1e9; } init(1, m, 1); vector <int> ff(m + 1, 0); for (int i = 1; i <= n; i++) { ff[c[i]]++; } if (n % 2 == 1) { memset(tree, 0, sizeof(tree)); for (int i = 1; i <= m; i++) { update(i, ff[i]); } for (int i = 1; i <= m; i++) { update(i, -ff[i]); int s = n, v = 0; for (auto j : occ[i]) { if (j % 2 == 1) { if (j + 1 <= n) { if (c[j + 1] != i) { v++; update(c[j + 1], -1); } } if (j == n) { s--; } else { s -= 2; } } else { if (c[j - 1] != i) { v++; update(c[j - 1], -1); s -= 2; } } } mn[i] = min(mn[i], v + s - tree[1]); for (auto j : occ[i]) { if (j % 2 == 1) { if (j + 1 <= n) { if (c[j + 1] != i) { update(c[j + 1], 1); } } } else { if (c[j - 1] != i) { update(c[j - 1], 1); } } } update(i, ff[i]); } } if (n % 2 == 1) { memset(tree, 0, sizeof(tree)); for (int i = 1; i <= m; i++) { update(i, ff[i]); } for (int i = 1; i <= m; i++) { update(i, -ff[i]); int s = n, v = 0; for (auto j : occ[i]) { if (j % 2 == 0) { if (c[j + 1] != i) { v++; update(c[j + 1], -1); } s -= 2; } else { if (j > 1) { if (c[j - 1] != i) { v++; update(c[j - 1], -1); s -= 2; } } else { s--; } } } mn[i] = min(mn[i], v + s - tree[1]); for (auto j : occ[i]) { if (j % 2 == 0) { if (c[j + 1] != i) { update(c[j + 1], 1); } } else { if (j > 1) { if (c[j - 1] != i) { update(c[j - 1], 1); } } } } update(i, ff[i]); } } if (n % 2 == 0) { memset(tree, 0, sizeof(tree)); for (int i = 1; i <= m; i++) { update(i, ff[i]); } for (int i = 1; i <= m; i++) { update(i, -ff[i]); int s = n, v = 0; for (auto j : occ[i]) { if (j % 2 == 1) { if (c[j + 1] != i) { v++; update(c[j + 1], -1); } s -= 2; } else { if (c[j - 1] != i) { v++; update(c[j - 1], -1); s -= 2; } } } mn[i] = min(mn[i], v + s - tree[1]); for (auto j : occ[i]) { if (j % 2 == 1) { if (c[j + 1] != i) { update(c[j + 1], 1); } } else { if (c[j - 1] != i) { update(c[j - 1], 1); } } } update(i, ff[i]); } } if (n % 2 == 0) { memset(tree, 0, sizeof(tree)); for (int i = 1; i <= m; i++) { update(i, ff[i]); } for (int i = 1; i <= m; i++) { update(i, -ff[i]); int s = n, v = 0; for (auto j : occ[i]) { if (j % 2 == 0) { if (j == n) { s--; continue; } if (c[j + 1] != i) { v++; update(c[j + 1], -1); } s -= 2; } else { if (j == 1) { s--; continue; } if (c[j - 1] != i) { v++; update(c[j - 1], -1); s -= 2; } } } mn[i] = min(mn[i], v + s - tree[1]); for (auto j : occ[i]) { if (j % 2 == 0) { if (j == n) { s--; continue; } if (c[j + 1] != i) { v++; update(c[j + 1], 1); } s -= 2; } else { if (j == 1) { s--; continue; } if (c[j - 1] != i) { v++; update(c[j - 1], 1); s -= 2; } } } update(i, ff[i]); } } 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...