# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
761480 | Khizri | Counting Mushrooms (IOI20_mushrooms) | C++17 | 7 ms | 336 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "mushrooms.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define F first
#define S second
#define INF 1e18
#define all(v) (v).begin(),(v).end()
#define rall(v) (v).rbegin(),(v).rend()
#define pii pair<int,int>
#define pll pair<ll,ll>
#define OK cout<<"Ok"<<endl;
#define MOD (ll)(1e9+7)
const int mxn=2e4+5;
int color[mxn];
int count_mushrooms(int n) {
if(n<=452){
int ans=1;
for(int i=1;i<n-1;i+=2){
vector<int>vt={i,0,i+1};
int k=use_machine(vt);
ans+=(2-k);
}
if((n-1)%2){
vector<int>vt={n-1,0};
int k=use_machine(vt);
ans+=(1-k);
}
return ans;
}
int k=83;
vector<int>x,y;
x.pb(0);
int idx=0;
for(int i=1;i<3;i++){
if(x.size()>=k||y.size()>=k) break;
idx=i;
vector<int>vt={0,i};
if(use_machine(vt)==0){
x.pb(i);
color[i]=1;
}
else{
y.pb(i);
color[i]=2;
}
}
int t=1;
int a,b;
if(x.size()>=2){
a=x[0],b=x[1];
}
else{
t=0;
a=y[0],b=y[1];
}
for(int i=3;i<n-1;i+=2){
if(x.size()>=k||y.size()>=k) break;
idx=i+1;
vector<int>vt={i,a,i+1,b};
int cnt=use_machine(vt);
if(t){
if(cnt==0){
x.pb(i);
x.pb(i+1);
}
else if(cnt==1){
y.pb(i);
x.pb(i+1);
}
else if(cnt==2){
x.pb(i);
y.pb(i+1);
}
else{
y.pb(i);
y.pb(i+1);
}
}
else{
if(cnt==0){
y.pb(i);
y.pb(i+1);
}
else if(cnt==1){
x.pb(i);
y.pb(i+1);
}
else if(cnt==2){
y.pb(i);
x.pb(i+1);
}
else{
x.pb(i);
x.pb(i+1);
}
}
}
int ok=0;
int ans=x.size();
if(x.size()<y.size()){
swap(x,y);
ok=1;
}
vector<int>qr;
for(int i=idx+1;i<n;i++){
qr.pb(i);
if(qr.size()==x.size()||i==n-1){
if(x.size()<y.size()){
swap(x,y);
ok=1-ok;
}
vector<int>vt;
for(int j=0;j<qr.size();j++){
vt.pb(qr[j]);
vt.pb(x[j]);
}
int cnt=use_machine(vt);
if(!ok){
int say=(cnt+1)/2;
ans+=qr.size()-say;
if(cnt%2==0){
x.pb(vt[0]);
}
else{
y.pb(vt[0]);
}
}
else{
int say=(cnt+1)/2;
ans+=say;
if(cnt%2==0){
x.pb(vt[0]);
}
else{
y.pb(vt[0]);
}
}
qr.clear();
}
}
return ans;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |