#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |