제출 #1281256

#제출 시각아이디문제언어결과실행 시간메모리
1281256Faggi드문 곤충 (IOI22_insects)C++20
0 / 100
1 ms332 KiB
#include <bits/stdc++.h> #define ll long long #define sz(x) int(x.size()) #define forn(i, n) for (i = 0; i < n; i++) #define all(x) x.begin(), x.end() #define pb push_back #define mp make_pair #define fr first #define se second using namespace std; void move_inside(int i); void move_outside(int i); int press_button(); vector<bool> vis, en; map<vector<bool>, ll> memo; ll n; void mi(ll x) { en[x] = 1; } void mo(ll x) { en[x] = 0; } ll pBtn() { auto it = memo.find(en); if (it != memo.end()) return it->second; for (ll i = 0; i < sz(en); i++) { if (vis[i] != en[i]) { if (en[i]) move_inside(i); else move_outside(i); vis[i] = en[i]; } } ll x = press_button(); memo[vis] = x; return x; } int min_cardinality(int N) { n = N; vis.assign(N, 0); en.assign(N, 0); vector<ll> in, out, ins; ll i; for(i=0; i<n; i++) ins.pb(i); mi(0); in.pb(0); ll inside = 1; for (auto k : ins) { if (k == 0) continue; mi(k); if (pBtn() > 1) { mo(k); out.pb(k); } else { in.pb(k); inside++; } } ll distinct = inside; ins = out; ll l = 1, r = n / distinct; ll ans = 1; while (l <= r) { ll mid = (l + r) / 2; vector<ll> in2, out2; ll added = 0; for (auto k : ins) { mi(k); if (pBtn() > mid) { mo(k); out2.pb(k); } else { in2.pb(k); added++; } } if (added + distinct * (mid - 1) == mid * distinct) { ans = mid; l = mid + 1; ins = out2; } else { for (auto k : in2) mo(k); r = mid - 1; ins = in2; } } return int(ans); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...