Submission #1068864

#TimeUsernameProblemLanguageResultExecution timeMemory
1068864j_vdd16Rarest Insects (IOI22_insects)C++17
10 / 100
249 ms428 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); 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...