Submission #855478

#TimeUsernameProblemLanguageResultExecution timeMemory
855478tvladm2009Giraffes (JOI22_giraffes)C++17
10 / 100
1 ms348 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { #ifdef ONPC freopen("input.txt", "r", stdin); #else ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); #endif // ONPC int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; } if (n <= 7) { int sol = (int) 1e9; vector<bool> vis(n + 1, 0); vector<int> perm; function<void(int)> bkt = [&] (int pos) { if (pos == n + 1) { bool ok = true; for (int l = 0; l < n; l++) { int mn = n + 1, mx = 0; for (int r = l; r < n; r++) { mx = max(mx, perm[r]); mn = min(mn, perm[r]); if (mn != perm[l] && mn != perm[r] && mx != perm[l] && mx != perm[r]) { ok = false; } } } if (ok) { int cost = 0; for (int i = 0; i < n; i++) { cost += (perm[i] != a[i]); } sol = min(sol, cost); } } for (int i = 1; i <= n; i++) { if (!vis[i]) { vis[i] = 1; perm.push_back(i); bkt(pos + 1); perm.pop_back(); vis[i] = 0; } } }; bkt(1); cout << sol << "\n"; return 0; } /// ** \/ sau /\ ** int sol = (int) 1e9; for (int mask = 0; mask < (1 << n); mask++) { vector<int> down, up; vector<int> cnt(n + 1, 0); for (int b = 0; b < n; b++) { if (mask & (1 << b)) { down.push_back(a[b]); cnt[a[b]]++; } } sort(down.rbegin(), down.rend()); for (int b = 1; b <= n; b++) { if (cnt[b] == 0) { up.push_back(b); } } if (down.empty() || up.empty() || down.back() < up[0]) { vector<int> v; for (auto &x : down) { v.push_back(x); } for (auto &x : up) { v.push_back(x); } assert((int) v.size() == n); int cost = 0; for (int i = 0; i < n; i++) { cost += (v[i] != a[i]); } sol = min(sol, cost); } if (down.empty() || up.empty() || up.back() > down[0]) { vector<int> v; for (auto &x : up) { v.push_back(x); } for (auto &x : down) { v.push_back(x); } assert((int) v.size() == n); int cost = 0; for (int i = 0; i < n; i++) { cost += (v[i] != a[i]); } sol = min(sol, cost); } } /// **// sau \\** function<bool(vector<int>)> isgood = [&](vector<int> perm) { bool ok = true; for (int l = 0; l < n; l++) { int mn = n + 1, mx = 0; for (int r = l; r < n; r++) { mx = max(mx, perm[r]); mn = min(mn, perm[r]); if (mn != perm[l] && mn != perm[r] && mx != perm[l] && mx != perm[r]) { ok = false; } } } return ok; }; for (int mask = 0; mask < (1 << n); mask++) { vector<int> x, y; for (int b = 0; b < n; b++) { if (mask & (1 << b)) { x.push_back(a[b]); } else { y.push_back(a[b]); } } sort(x.begin(), x.end()); sort(y.begin(), y.end()); vector<int> v; for (auto &it : x) { v.push_back(it); } for (auto &it : y) { v.push_back(it); } if (isgood(v)) { int cost = 0; for (int i = 0; i < n; i++) { cost += (v[i] != a[i]); } sol = min(sol, cost); } sort(x.rbegin(), x.rend()); sort(y.rbegin(), y.rend()); v.clear(); for (auto &it : x) { v.push_back(it); } for (auto &it : y) { v.push_back(it); } if (isgood(v)) { int cost = 0; for (int i = 0; i < n; i++) { cost += (v[i] != a[i]); } sol = min(sol, cost); } } cout << sol << "\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...