Submission #899915

#TimeUsernameProblemLanguageResultExecution timeMemory
899915abcvuitunggioCounting Mushrooms (IOI20_mushrooms)C++17
100 / 100
5 ms712 KiB
#include "mushrooms.h" #include <bits/stdc++.h> using namespace std; const int k=100; vector <int> a[2],ve; int res,x,c; void update(){ if (a[0].size()<a[1].size()){ swap(a[0],a[1]); c^=1; } } int count_mushrooms(int n){ if (n<=227){ for (int i=1;i<n;i++) res+=1-use_machine({0,i}); return res+1; } a[0].push_back(0); for (int i=1;i<3;i++){ int x=use_machine({0,i}); a[x].push_back(i); } update(); x=use_machine({3,a[0][0],4,a[0][1]}); a[x&1].push_back(3); a[x/2&1].push_back(4); update(); for (int i=5;max(a[0].size(),a[1].size())<k;){ x=use_machine({i,a[0][0],i+1,a[0][1],i+2,a[0][2]}); a[x&1].push_back(i); if (x/2%2==0){ a[x/4].push_back(i+1); a[x/4].push_back(i+2); i+=3; } else if (a[1].size()<2){ x=use_machine({a[0][0],i+1}); a[x].push_back(i+1); a[x^1].push_back(i+2); i+=3; } else{ x=use_machine({i+4,a[0][0],i+3,a[0][1],i+2,a[0][2],a[1][0],i+1,a[1][1]})-1; a[x&1].push_back(i+4); a[x/2&1].push_back(i+3); a[x/4].push_back(i+2); a[x/4^1].push_back(i+1); i+=5; } } update(); res=a[1].size(); for (int i=a[0].size()+a[1].size();i<n;){ ve.clear(); int r=min(i+(int)a[0].size(),n); for (int j=i;j<r;j++){ ve.push_back(j); ve.push_back(a[0][j-i]); } x=use_machine(ve); res+=(x+1)/2; a[x&1].push_back(i); if (a[0].size()<a[1].size()){ res=r-res; swap(a[0],a[1]); c^=1; } i=ve[ve.size()-2]+1; } return (c?res:n-res); }
#Verdict Execution timeMemoryGrader output
Fetching results...