Submission #1043883

#TimeUsernameProblemLanguageResultExecution timeMemory
1043883juicyRope (JOI17_rope)C++17
100 / 100
1307 ms92184 KiB
#include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "debug.h" #else #define debug(...) 42 #endif const int N = 1e6 + 5; int n, m; int c[N], res[N], cnt[N], s[4 * N]; vector<int> g[N]; void bld(int id = 1, int l = 1, int r = m) { if (l == r) { s[id] = cnt[l]; return; } int md = (l + r) / 2; bld(id * 2, l, md); bld(id * 2 + 1, md + 1, r); s[id] = max(s[id * 2], s[id * 2 + 1]); } void upd(int i, int x, int id = 1, int l = 1, int r = m) { if (l == r) { s[id] += x; return; } int md = (l + r) / 2; if (i <= md) { upd(i, x, id * 2, l, md); } else { upd(i, x, id * 2 + 1, md + 1, r); } s[id] = max(s[id * 2], s[id * 2 + 1]); } void add(int u, int v) { g[u].push_back(v); g[v].push_back(u); } void solve(int p) { for (int i = 1; i <= m; ++i) { g[i].clear(); } bld(); for (int i = p; i + 1 <= n; i += 2) { if (c[i] != c[i + 1]) { add(c[i], c[i + 1]); } } for (int i = 1; i <= m; ++i) { upd(i, -cnt[i]); for (int j : g[i]) { upd(j, -1); } res[i] = max(res[i], cnt[i] + s[1]); for (int j : g[i]) { upd(j, 1); } upd(i, cnt[i]); } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; for (int i = 1; i <= n; ++i) { cin >> c[i]; ++cnt[c[i]]; } solve(1); solve(2); for (int i = 1; i <= m; ++i) { cout << n - res[i] << "\n"; } return 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...