Submission #1073285

#TimeUsernameProblemLanguageResultExecution timeMemory
1073285GrindMachineRarest Insects (IOI22_insects)C++17
0 / 100
35 ms600 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; template<typename T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; typedef long long int ll; typedef long double ld; typedef pair<int,int> pii; typedef pair<ll,ll> pll; #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL) #define pb push_back #define endl '\n' #define sz(a) (int)a.size() #define setbits(x) __builtin_popcountll(x) #define ff first #define ss second #define conts continue #define ceil2(x,y) ((x+y-1)/(y)) #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define yes cout << "Yes" << endl #define no cout << "No" << endl #define rep(i,n) for(int i = 0; i < n; ++i) #define rep1(i,n) for(int i = 1; i <= n; ++i) #define rev(i,s,e) for(int i = s; i >= e; --i) #define trav(i,a) for(auto &i : a) template<typename T> void amin(T &a, T b) { a = min(a,b); } template<typename T> void amax(T &a, T b) { a = max(a,b); } #ifdef LOCAL #include "debug.h" #else #define debug(x) 42 #endif /* refs: https://youtu.be/mm5Nv81P5u8?t=19948 edi first, figure out the #of distinct guys in the array b.s on answer let's say we want to check if ans < mid go over all indices and put each value into the machine if val > mid, then pop the recently added value from the machine at the end, count the #of guys that were added to the machine if cnt == mid*unique, then each guy appears at least mid #of times, so return false otherwise, cnt < mid*unique, so there is at least 1 guy that appears < mid #of times, so return true gets around 50 points key idea for 100 points: try to save operations between successive calls of b.s cnt == mid*unique: we increase the left bound of the b.s there are only good guys in the machine because we increase the left bound, these good guys will remain forever no need to remove them and add them again (put them forever in the machine) cnt < mid*unique: we decrease the right bound of the b.s if a guy is bad in this iteration, he would be bad in the successive iteration too so ignore the bad guys also, remember to remove the good guys in this iteration from the machine if case 1 is true, mid*unique guys removed from consideration if case 2 is true, at least active-mid*unique guys removed from consideration mid*unique splits the active set into almost 2 equal halves so at each stage, around n/2 guys are removed from consideration so we get n+n/2+n/4+... = 2n queries n queries for finding the #of unique guys so around 3n queries in total refer https://codeforces.com/blog/entry/105835?#comment-942719 for more details further optimizations for full score: set l and r bounds of the b.s optimally (l = 1, r = (n/unique)-1, ans = n/unique) (ans is at most n/unique) stop adding guys to the machine once the limit (cnt == mid*unique) is reached randomize the order in which the guys are added to the machine */ const int MOD = 1e9 + 7; const int N = 1e5 + 5; const int inf1 = int(1e9) + 5; const ll inf2 = ll(1e18) + 5; #include "insects.h" int min_cardinality(int n) { int d = 0; { vector<int> v; rep(i,n){ move_inside(i); if(press_button() > 1){ move_outside(i); } else{ v.pb(i); d++; } } trav(i,v){ move_outside(i); } } vector<bool> state(n,1); // 0 = ignored, 1 = active int lo = 1, hi = n/d; int ans = -1; int cnt = 0; auto ok = [&](int mid){ vector<int> stay,leave; rep(i,n){ if(!state[i]) conts; move_inside(i); cnt++; if(press_button() > mid){ move_outside(i); cnt--; leave.pb(i); } else{ stay.pb(i); } } bool ok = (cnt == mid*d); if(ok){ trav(i,stay){ state[i] = 0; } } else{ trav(i,leave){ move_outside(i); state[i] = 0; } cnt = 0; } return ok; }; while(lo <= hi){ int mid = (lo+hi) >> 1; if(ok(mid)){ ans = mid; lo = mid+1; } else{ hi = mid-1; } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...