Submission #1069905

#TimeUsernameProblemLanguageResultExecution timeMemory
1069905j_vdd16Rarest Insects (IOI22_insects)C++17
91.90 / 100
60 ms596 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; int min_cardinality(int N) { vb isDone(N); vi madeItBigger(N, 0); vb isRemoved(N); loop(i, N) { move_inside(i); int res = press_button(); if (res > 1) { madeItBigger[i] = 1; move_outside(i); isRemoved[i] = true; } } int diffCount = 0; loop(i, N) { if (!isRemoved[i]) { diffCount++; isDone[i] = true; } } int prevRes = 1; loop(i, N) { if (isDone[i]) continue; move_inside(i); int res = press_button(); if (res > prevRes) { madeItBigger[i] = max(madeItBigger[i], prevRes); prevRes = res; } } int maxCount = prevRes; 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 = (4 * l + r + 4) / 5; int m = (2 * l + r + 2) / 3; int lessThanM = diffCount * extra; isRemoved = vb(N); int prevPress = extra; loop(i, N) { if (isDone[i]) continue; if (madeItBigger[i] >= possible[m]) { isRemoved[i] = true; } else { move_inside(i); int res = press_button(); if (res > prevPress) { madeItBigger[i] = max(madeItBigger[i], prevPress); prevPress = res; } if (res > possible[m]) { madeItBigger[i] = max(madeItBigger[i], 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]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...