Submission #835460

#TimeUsernameProblemLanguageResultExecution timeMemory
835460pavementRarest Insects (IOI22_insects)C++17
90.30 / 100
181 ms520 KiB
#include "insects.h" #include <bits/stdc++.h> using namespace std; #define pb push_back int N; vector<int> machine; vector<bool> in_set; void my_move_inside(int x) { in_set[x] = 1; } void my_move_outside(int x) { in_set[x] = 0; } int my_press_button() { vector<int> cur; for (int i = 0; i < N; i++) { if (in_set[i]) { cur.pb(i); } } vector<int> tmp; set_symmetric_difference(cur.begin(), cur.end(), machine.begin(), machine.end(), back_inserter(tmp)); sort(cur.begin(), cur.end()); for (auto i : tmp) { if (binary_search(cur.begin(), cur.end(), i)) { move_inside(i); } else { move_outside(i); } } machine = cur; return press_button(); } int min_cardinality(int N) { ::N = N; in_set.resize(N); vector<int> v, alr_in; my_move_inside(0); v.pb(0); for (int i = 1; i < N; i++) { my_move_inside(i); if (my_press_button() != 1) { my_move_outside(i); } else { v.pb(i); } } vector<int> insects; insects.resize(N); iota(insects.begin(), insects.end(), 0); int lo = 1, hi = N / (int)v.size(), ans = -1; while (lo <= hi) { int mid = (lo + hi) / 2; vector<int> to_remove = alr_in; for (int i : insects) { if (!binary_search(v.begin(), v.end(), i) && !binary_search(alr_in.begin(), alr_in.end(), i)) { my_move_inside(i); if (my_press_button() > mid) { my_move_outside(i); } else { to_remove.pb(i); } } } if ((int)to_remove.size() == (int)v.size() * (mid - 1)) { ans = mid; lo = mid + 1; alr_in = to_remove; sort(alr_in.begin(), alr_in.end()); } else { insects = v; hi = mid - 1; for (auto i : to_remove) { my_move_outside(i); insects.pb(i); } alr_in.clear(); } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...