Submission #838476

#TimeUsernameProblemLanguageResultExecution timeMemory
838476Theo830Rarest Insects (IOI22_insects)C++17
100 / 100
60 ms680 KiB
#include "insects.h"
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
const ll INF = 1e9+7;
const ll MOD = 998244353;
typedef pair<ll,ll> ii;
#define iii pair<ii,ll>
#define f(i,a,b) for(int i = a;i < b;i++)
#define pb push_back
#define vll vector<ll>
#define F first
#define S second
#define all(x) (x).begin(), (x).end()
///I hope I will get uprating and don't make mistakes
///I will never stop programming
///sqrt(-1) Love C++
///Please don't hack me
///@TheofanisOrfanou Theo830
///Think different approaches (bs,dp,greedy,graphs,shortest paths,mst)
///Stay Calm
///Look for special cases
///Beware of overflow and array bounds
///Think the problem backwards
///Training
int min_cardinality(int N){
    srand(time(0));
    ll n = N;
    set<ll>ex;
    set<ll>olo;
    bool v[n] = {0};
    f(i,0,n){
        move_inside(i);
        olo.insert(i);
        ex.insert(i);
        v[i] = 1;
        if(1 != press_button()){
            ex.erase(i);
            v[i] = 0;
            move_outside(i);
        }
    }
    ll d = ex.size();
    ll l = 2,r = n / d;
    ll ans = 1;
    set<ll>cur = ex;
    while(l <= r){
        ll mid = (l+r)/2 + rand() % 2;
        mid = min(mid,r);
        for(auto x:olo){
            if(!v[x]){
                move_inside(x);
                v[x] = 1;
                cur.insert(x);
                if(press_button() > mid){
                    move_outside(x);
                    cur.erase(x);
                    v[x] = 0;
                }
            }
        }
        if((ll)cur.size() == d * mid){
            l = mid + 1;
            ex = cur;
            ans = max(ans,mid);
        }
        else{
            olo = cur;
            for(auto x:cur){
                if(!ex.count(x)){
                    v[x] = 0;
                    move_outside(x);
                }
            }
            cur = ex;
            r = mid - 1;
        }
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...