#include<bits/stdc++.h>
#include "mushrooms.h"
using namespace std;
int firstTrue(int lo, int hi) {
hi++;
while(lo < hi) {
int mid = lo+(hi-lo)/2;
if(lo == mid) return lo+1;
vector<int> cur;
for(int i=lo; i<=mid; i++) cur.push_back(i);
int nbAdj=use_machine(cur);
if(nbAdj >= 1) hi=mid;
else if(nbAdj == hi-lo) return lo+1;
else lo=mid;
}
return lo+1;
}
int count_mushrooms(int n) {
vector<int> a;
int lo=0;
bool aa=true;
while(lo != n) {
int lolo=firstTrue(lo, n-1);
if(aa) for(int i=lo; i<lolo; i++) a.push_back(i);
lo=lolo;
aa=!aa;
if(a.size() > sqrt(n)) break;
}
set<int> s;
for(auto x : a) s.insert(x);
int ans=a.size();
// for(auto x : a) cout << x << ' ';
// cout << endl;
for(int i=a[a.size()-1]+1; i<n; i+=a.size()-1) {
vector<int> cur={a[0]};
int ii=i, idx=1;
while(idx < a.size() && ii < n) {
if(s.count(ii)) {
ii++; continue;
}
cur.push_back(ii);
cur.push_back(a[idx]);
idx++; ii++;
}
// for(auto x : cur) cout << x << ' ';
// cout << endl;
ans+=(cur.size()-use_machine(cur))/2;
// cout << ans << endl;
}
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |