Submission #1069791

#TimeUsernameProblemLanguageResultExecution timeMemory
1069791j_vdd16Rarest Insects (IOI22_insects)C++17
53.20 / 100
113 ms832 KiB
#include "insects.h" #include <algorithm> #include <bitset> #include <cstdint> #include <cstring> #include <iostream> #include <limits.h> #include <math.h> #include <map> #include <numeric> #include <queue> #include <set> #include <stack> #include <string> #include <vector> //#define int long long #define loop(X, N) for(int X = 0; X < (N); X++) #define all(V) V.begin(), V.end() #define rall(V) V.rbegin(), V.rend() using namespace std; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int, int> ii; typedef vector<ii> vii; typedef vector<vector<ii>> vvii; typedef vector<bool> vb; typedef vector<vector<bool>> vvb; typedef uint64_t u64; typedef int64_t i64; vb isDone; int min_cardinality(int N) { isDone = vb(N); vb isRemoved(N); loop(i, N) { move_inside(i); int res = press_button(); if (res > 1) { move_outside(i); isRemoved[i] = true; } } int diffCount = 0; loop(i, N) { if (!isRemoved[i]) { diffCount++; //move_outside(i); isDone[i] = true; } } loop(i, N) { if (isDone[i]) continue; move_inside(i); } int maxCount = press_button(); loop(i, N) { if (isDone[i]) continue; move_outside(i); } int total = N; vi possible; for (int x = 1; x <= N; x++) { if (diffCount == 2 && x + maxCount != total) continue; if (diffCount == 1 && (x != maxCount || x != total)) continue; if ((diffCount - 1) * x + maxCount <= total && total <= (diffCount - 1) * maxCount + x) { possible.push_back(x); } } int extra = 1; int l = 0, r = possible.size() - 1; while (l < r) { int m = (l + r + 1) / 2; int lessThanM = diffCount * extra; isRemoved = vb(N); loop(i, N) { if (isDone[i]) continue; move_inside(i); int res = press_button(); if (res > possible[m]) { move_outside(i); isRemoved[i] = true; } else { lessThanM++; } } if (lessThanM == diffCount * possible[m]) { l = m; loop(i, N) { if (!isRemoved[i] && !isDone[i]) { isDone[i] = true; } } extra = possible[m]; } else { r = m - 1; loop(i, N) { if (!isRemoved[i] && !isDone[i]) { move_outside(i); } } } } return possible[l]; // vb isDone(N); // int diffCount = 0; // vb isNew(N); // loop(i, N) { // move_inside(i); // int res = press_button(); // if (res == 1) { // diffCount++; // isNew[i] = true; // } // else { // move_outside(i); // } // } // loop(i, N) { // if (isNew[i]) { // move_outside(i); // } // } // int total = N; // while (true) { // if (diffCount == 1) { // return total; // } // int maxCount = 0; // int lastIncrease = 0; // loop(i, N) { // if (isDone[i]) continue; // move_inside(i); // int res = press_button(); // if (res > maxCount) { // maxCount = res; // lastIncrease = i; // } // } // if (diffCount == 2) { // return total - maxCount; // } // vi possible; // for (int x = 1; x <= total; x++) { // // if (diffCount == 2 && x + maxCount != total) continue; // // if (diffCount == 1 && (x != maxCount || x != total)) continue; // if ((diffCount - 1) * x + maxCount <= total && total <= (diffCount - 1) * maxCount + x) { // possible.push_back(x); // } // } // if (possible.size() == 1) { // return possible[0]; // } // else if (possible.size() == 0) { // return -1; // } // for (int i = N - 1; i > lastIncrease; i--) { // if (isDone[i]) continue; // move_outside(i); // } // vb isPartOfMax(N); // isPartOfMax[lastIncrease] = true; // for (int i = 0; i < lastIncrease; i++) { // if (isDone[i]) continue; // move_outside(i); // int res = press_button(); // if (res < maxCount) { // move_inside(i); // isPartOfMax[i] = true; // } // } // loop(i, N) { // if (isPartOfMax[i]) { // isDone[i] = true; // move_outside(i); // } // } // diffCount--; // total -= maxCount; // } // return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...