제출 #627814

#제출 시각아이디문제언어결과실행 시간메모리
627814Fischer드문 곤충 (IOI22_insects)C++17
54.07 / 100
1262 ms7268 KiB
#include <bits/stdc++.h> #include "insects.h" using namespace std; const int maxn = 2010; int in[maxn]; vector<bool> memo; int n, c; void put(int x) { memo[x] = 1; } void pop(int x) { memo[x] = 0; } map<vector<bool>, int> mapMemo; bool last[maxn]; int push() { if (mapMemo.count(memo)) return mapMemo[memo]; for (int i = 0; i < n; ++i) { if (last[i] != (in[i] != 0)) { if (last[i]) move_outside(i); else move_inside(i); last[i] ^= 1; } } return mapMemo[memo] = press_button(); } bool p(int x) { int len = c; for (int i = 0; i < n; ++i) { if (in[i] == -1) continue; put(i); in[i] = 1; if (push() > x) { pop(i); in[i] = 0; } else { len += 1; } } for (int i = 0; i < n; ++i) { if (in[i] == 1) { pop(i); in[i] = 0; } } return len == x * c; } int min_cardinality(int N) { n = N; memo.assign(n, 0); c = 0; for (int i=0; i<N; ++i) { put(i); in[i] = -1; if (push() == 1) c += 1; else pop(i), in[i] = 0; } if (c == 1) return N; if (c == N) return 1; int lo = 1, hi = N / c; while (lo < hi) { int mid = (lo + hi + 1) / 2; if (p(mid)) lo = mid; else hi = mid-1; } return lo; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...