Submission #629437

#TimeUsernameProblemLanguageResultExecution timeMemory
629437studyRarest Insects (IOI22_insects)C++17
53.48 / 100
157 ms336 KiB
#include <bits/stdc++.h> #include "insects.h" using namespace std; int min_cardinality(int N) { vector<int> a(N); for (int i=0; i<N; ++i){ a[i] = i; } // random_shuffle(a.begin(),a.end()); bitset<2000> inside; int nbElems = 0; for (int i=0; i<N; ++i){ move_inside(a[i]); if (i != 0){ int maxFreq = press_button(); if (maxFreq > 1) move_outside(a[i]); else{ ++nbElems; inside[a[i]] = true; // cout << a[i] << endl; } } else{ ++nbElems; inside[a[i]] = true; // cout << a[i] << endl; } } if (nbElems == 1) return N; if (nbElems == N) return 1; int in = nbElems, crt = 1; int deb = 2, fin = N/nbElems, ans = 1; vector<int> last; while (deb <= fin){ int mid = fin-(fin-deb)/3.4; if (crt > mid) mid = deb+(fin-deb)/3.4; bool ok = false; if (crt > mid){ /* for (int i:last){ inside[i] = false; in--; move_outside(i); } */ for (int i=0; i<crt-mid; ++i){ if (last.empty()) break; inside[last.back()] = false; move_outside(last.back()); last.pop_back(); in--; } bool yes = false; int cnt = 0; // random_shuffle(last.begin(),last.end()); while (!last.empty()){ int sqrt_siz = sqrt((int)last.size()); if (cnt%40 == 0 and press_button() <= mid){ yes = true; break; } ++cnt; int l = last.back(); move_outside(l); inside[l] = false; last.pop_back(); in--; } // if (last.empty() and press_button() > mid) return ans; if (in == nbElems*mid and yes){ ok = true; } crt = mid; } else last.clear(); int delta = mid-crt; if (!ok){ // random_shuffle(a.begin(),a.end()); vector<int> idx; for (int i=0; i<N; ++i){ if (inside[a[i]]) continue; --delta; if (delta >= 0){ inside[a[i]] = true; move_inside(a[i]); ++in; last.emplace_back(a[i]); continue; } idx.emplace_back(a[i]); } int siz = idx.size(); for (int i=0; i<idx.size(); i += sqrt(siz)){ int add = min((int)sqrt(siz),mid*nbElems-in); for (int j=i; j<min((int)idx.size(),i+add); ++j){ move_inside(idx[j]); inside[idx[j]] = true; ++in; } crt = press_button(); // cout << mid*nbElems-in << ' ' << mid << ' ' << crt << endl; int place = i; while (crt > mid){ move_outside(idx[place]); inside[idx[place]] = false; --in; place++; crt = press_button(); } // cout << mid*nbElems-in << ' ' << mid << ' ' << crt << endl; for (int j=place; j<=min((int)idx.size(),i+add)-1; ++j) last.emplace_back(idx[j]); if (in == mid*nbElems and crt == mid){ ok = true; break; } for (int j=min((int)idx.size(),i+add); j<min((int)idx.size(),i+(int)sqrt(siz)); ++j){ move_inside(idx[j]); ++in; crt = press_button(); if (in == mid*nbElems and crt == mid){ ok = true; inside[idx[j]] = true; last.emplace_back(idx[j]); // cout << crt << ' ' << in << endl; break; } // cout << mid*nbElems-in << ' ' << mid << ' ' << crt << endl; if (crt > mid){ move_outside(idx[j]); --in; --crt; } else{ // cout << a[i] << ' ' << in << endl; inside[idx[j]] = true; last.emplace_back(idx[j]); } } if (ok) break; for (int j=i; j<place; ++j){ move_inside(idx[j]); ++in; crt = press_button(); if (in == mid*nbElems and crt == mid){ ok = true; inside[idx[j]] = true; last.emplace_back(idx[j]); // cout << crt << ' ' << in << endl; break; } // cout << mid*nbElems-in << ' ' << mid << ' ' << crt << endl; if (crt > mid){ move_outside(idx[j]); --in; --crt; } else{ // cout << a[i] << ' ' << in << endl; inside[idx[j]] = true; last.emplace_back(idx[j]); } } } } // cout << mid << endl; if (ok){ crt = mid; ans = mid; deb = mid+1; } else fin = mid-1; crt = mid; } return ans; }

Compilation message (stderr)

insects.cpp: In function 'int min_cardinality(int)':
insects.cpp:56:9: warning: unused variable 'sqrt_siz' [-Wunused-variable]
   56 |     int sqrt_siz = sqrt((int)last.size());
      |         ^~~~~~~~
insects.cpp:92:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   92 |    for (int i=0; i<idx.size(); i += sqrt(siz)){
      |                  ~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...