Submission #206664

#TimeUsernameProblemLanguageResultExecution timeMemory
206664opukittpceno_hhrRope (JOI17_rope)C++17
0 / 100
2512 ms376 KiB
#include <iostream> #include <vector> #include <map> #include <set> #include <queue> #include <algorithm> #include <string> #include <cmath> #include <cstdio> #include <iomanip> #include <fstream> #include <cassert> #include <cstring> #include <unordered_set> #include <unordered_map> #include <numeric> #include <ctime> #include <bitset> #include <complex> #include <random> using namespace std; const int INF = 1e9 + 239; const int NONE = -1; int eq(int a, int b) { if (a == NONE || b == NONE) { return 1; } else { return a == b; } } int cans(vector<int> s) { int n = (int)s.size(); auto can = [&](int i, int len) { vector<int> a; assert(i + len <= n); for (int j = 0; j < len; j++) { a.push_back(s[i + j]); } int c = 0; for (int j = 0; j < len / 2; j++) { c += !eq(a[j], a[len - 1 - j]); } return c; }; vector<int> pdp(n + 1, INF); pdp[0] = 0; for (int i = 0; i < n; i++) { for (int len = 2; i + len <= n; len++) { pdp[i + len / 2] = min(pdp[i + len / 2], pdp[i] + can(i, len)); } } reverse(s.begin(), s.end()); vector<int> sdp(n + 1, INF); sdp[0] = 0; // for (auto t : s) { // cerr << t << ' '; // } // cerr << endl; for (int i = 0; i < n; i++) { for (int len = 2; i + len <= n; len++) { // if (i + len / 2 == 2 && sdp[i] == 0 && can(i, len) == 0) { // cout << "? " << i << ' ' << len << endl; // } sdp[i + len / 2] = min(sdp[i + len / 2], sdp[i] + can(i, len)); } } int ans = 0; for (int i = 0; i <= n; i++) { if (n - 2 - i >= 0) { // if (pdp[i] + sdp[n - 2 - i] == 0) { // cout << "! " << i << ' ' << n - 2 - i << endl; // } ans = min(ans, pdp[i] + sdp[n - 2 - i]); } } return ans == 0; } int solve(vector<int> s, int a, int b) { int n = (int)s.size(); int ans = n; for (int i = 0; i < (1 << n); i++) { vector<int> ts = s; for (int j = 0; j < n; j++) { if ((i >> j) & 1) { ts[j] = a; } else { ts[j] = b; } } if (cans(ts)) { int c = 0; for (int j = 0; j < n; j++) { c += !eq(s[j], ts[j]); } ans = min(ans, c); // if (c == 0) { // cout << "hr " << endl; // for (auto t : s) { // cout << t << ' '; // } // cout << endl; // for (auto t : ts) { // cout << t << ' '; // } // cout << endl; // } } } for (auto t : s) { ans += (t == NONE); } return ans; } signed main() { ios_base::sync_with_stdio(false); cin.tie(0); // vector<int> a; // a = {2, 2, 1, 1, NONE, NONE, 2, 1, 1, 2}; // cout << solve(a, 2, 1) << endl; // vector<int> a; // a = {2, 2, 1, 1, 1, 1, 2, 1, 1, 2}; // cout << cans(a) << endl; int n, m; cin >> n >> m; vector<int> a(n); for (auto &t : a) { cin >> t; t--; } vector<int> ans(m, n); for (int i = 0; i < m; i++) { for (int j = i; j < m; j++) { vector<int> ta = a; for (auto &x : ta) { if (x != i && x != j) x = NONE; } int v = solve(ta, i, j); ans[i] = min(ans[i], v); ans[j] = min(ans[j], v); } } for (auto t : ans) { cout << t << '\n'; } }
#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...