Submission #731977

#TimeUsernameProblemLanguageResultExecution timeMemory
731977alextodoranRarest Insects (IOI22_insects)C++17
0 / 100
46 ms208 KiB
/**

 /\      /\
 \_\_//_/_/
  / 0  0  \
  \  /   \/
  /____ \/ \
  (o  o)/ \
   \__/\ \

**/

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int E_MAX = 11;

void move_inside (int i);
void move_outside (int i);
int press_button ();

int min_cardinality (int N) {
    bool in[N];
    int id[N];
    fill(in, in + N, false);
    int dist = 0;
    for (int i = 0; i < N; i++) {
        move_inside(i);
        if (press_button() > 1) {
            move_outside(i);
        } else {
            in[i] = true;
            id[i] = dist++;
        }
    }
    if (dist <= 8) {
        int occ[dist];
        fill(occ, occ + dist, 0);
        for (int i = 0; i < N; i++) {
            if (in[i] == false) {
                move_inside(i);
                for (int j = 0; j < N; j++) {
                    if (in[j] == true) {
                        move_outside(j);
                        if (press_button() == 1) {
                            in[j] = false;
                            id[i] = id[j];
                            break;
                        }
                        move_inside(j);
                    }
                }
                in[i] = true;
            }
            occ[id[i]]++;
        }
        int mn = N;
        for (int i = 0; i < dist; i++) {
            mn = min(mn, occ[i]);
        }
        return mn;
    }
    if (dist == N) {
        return 1;
    }
    bool bad[N];
    fill(bad, bad + N, true);
    int cnt = dist;
    int l = 1, r = N / dist;
    while (l < r) {
        int k = (l * 3 + r + 3) / 4;
        vector <int> v1, v2;
        for (int i = 0; i < N; i++) {
            int suff = 0;
            for (int j = i; j < N; j++) {
                if (in[j] == false && bad[j] == false) {
                    suff++;
                }
            }
            if (cnt + suff < dist * k) {
                break;
            }
            if (in[i] == false && bad[i] == false) {
                move_inside(i);
                if (press_button() > k) {
                    move_outside(i);
                    bad[i] = true;
                    v1.push_back(i);
                } else {
                    in[i] = true;
                    v2.push_back(i);
                    cnt++;
                }
            }
        }
        if (cnt == dist * k) {
            l = k;
            for (int i : v1) {
                bad[i] = false;
            }
        } else {
            r = k - 1;
            for (int i : v2) {
                move_outside(i);
                in[i] = false;
                cnt--;
            }
        }
    }
    return l;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...