Submission #815502

#TimeUsernameProblemLanguageResultExecution timeMemory
815502JakobZorzRarest Insects (IOI22_insects)C++17
0 / 100
3080 ms208 KiB
#include"insects.h"
#include<iostream>
#include<vector>
#include<set>
using namespace std;

vector<bool>inside;
vector<bool>dead;
int num_inside;
int n,distinct;

int c_press_button(){
    return press_button();
}

void c_move_inside(int a){
    inside[a]=true;
    num_inside++;
    move_inside(a);
}

void c_move_outside(int a){
    inside[a]=false;
    num_inside--;
    move_outside(a);
}

int get_distinct(){
    for(int i=0;i<n;i++){
        c_move_inside(i);
        if(c_press_button()>1)
            c_move_outside(i);
    }
    
    return num_inside;
}

int min_cardinality(int N){
    n=N;
    inside.resize(n);
    distinct=get_distinct();
    dead=inside;
    
    int f=1;
    int r=N-distinct;
    while(distinct<=r){
        int c=(r+2*distinct+1)/(2*distinct);
        for(int i=0;i<n;i++)
            if(!dead[i]&&inside[i]&&num_inside>distinct*f+c)
                c_move_outside(i);
        for(int i=0;i<n;i++)
            if(!dead[i]&&!inside[i]){
                c_move_inside(i);
                if(c_press_button()>f+c)
                    c_move_outside(i);
            }
        
        if(num_inside==(f+c)*distinct){
            f+=c;
            for(int i=0;i<n;i++)
                if(!dead[i]&&inside[i]){
                    r--;
                    dead[i]=true;
                }
        }else{
            for(int i=0;i<n;i++)
                if(!dead[i]&&!inside[i]){
                    r--;
                    dead[i]=true;
                }
        }
    }
    return f;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...