Submission #1266775

#TimeUsernameProblemLanguageResultExecution timeMemory
1266775ThylOneRarest Insects (IOI22_insects)C++17
100 / 100
15 ms460 KiB
//#define LOCAL #include "insects.h" #include <algorithm> #include<bits/stdc++.h> using namespace std; #define pb push_back set<int> bucket; void push_in(int insect){ assert(bucket.find(insect) == bucket.end()); bucket.insert(insect); move_inside(insect); } void push_out(int insect){ assert(bucket.find(insect) != bucket.end()); bucket.erase(insect); move_outside(insect); } void empty_bucket(){ for(int u:bucket){ push_out(u); } } int min_cardinality(int N) { srand(42); bucket.clear(); int D = 0; set<int> insect_q; for(int i = 0 ; i < N ; i++){ push_in(i); if(press_button() == 1){D++;} else{insect_q.insert(i); push_out(i);} } //On va maintenant proceder a la dichotomie int low = 1 ; int high = N / D + 1; while(high - low > 1){ vector<int> to_inspect; for(int u:insect_q)to_inspect.emplace_back(u); random_shuffle(to_inspect.begin(), to_inspect.end()); int bound = (low + high)/2; vector<int> add_tturn, out; for(int i:to_inspect){ push_in(i); int r = press_button(); if(r > bound){ push_out(i); out.push_back(i); continue; } add_tturn.push_back(i); if(bound*D == bucket.size())break; } if(bound*D==bucket.size()){ low = bound; for(int u:add_tturn)insect_q.erase(u); }else{ for(int u:add_tturn)push_out(u); for(int u:out)insect_q.erase(u); high = bound; } } return low; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...