Submission #630440

#TimeUsernameProblemLanguageResultExecution timeMemory
630440CyanForcesRarest Insects (IOI22_insects)C++17
47.50 / 100
216 ms1732 KiB
#include "insects.h" #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for(int i = a; i < (b); ++i) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() #define debug(...) //ignore typedef long long ll; typedef pair<int, int> pii; typedef vector<int> vi; typedef long double ld; int min_cardinality(int N) { int n = N; set<int> active; using H = unsigned long long; vector<H> rnd(n); mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); rep(i,0,n) rnd[i] = rng(); H hsh = 13; map<H,int> queried; queried[hsh] = 0; auto add = [&](int x) { assert(!active.count(x)); active.emplace(x); hsh ^= rnd[x]; move_inside(x); }; auto rem = [&](int x) { assert(active.count(x)); active.erase(x); hsh ^= rnd[x]; move_outside(x); }; auto query = [&]() { if(!queried.count(hsh)) queried[hsh] = press_button(); return queried[hsh]; }; auto empty_all = [&]() { while(sz(active)) rem(*rbegin(active)); }; auto go = [&](int b) { rep(i,0,n) if(!active.count(i)) { add(i); if(query() > b) rem(i); } }; go(1); int distinct = sz(active); int l = 1, r = n+1; while(l+1 != r) { int m = (l+r)/2; empty_all(); go(m); if(sz(active) == m * distinct) l = m; else r = m; } return l; } // void move_inside(int i); // void move_outside(int i); // int press_button();
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...