Submission #364949

#TimeUsernameProblemLanguageResultExecution timeMemory
364949leinad2Counting Mushrooms (IOI20_mushrooms)C++17
100 / 100
11 ms548 KiB
#include "mushrooms.h" #include<bits/stdc++.h> using namespace std; int count_mushrooms(int n) { if(n<=200) { int ans=1; for(int i=1;i<n;i++) { vector<int>v; v.push_back(0);v.push_back(i); if(use_machine(v)==0)ans++; } return ans; } vector<int>v[2]; v[0].push_back(0); vector<int>qr; qr.push_back(0);qr.push_back(1); v[use_machine(qr)].push_back(1); qr.pop_back();qr.push_back(2); v[use_machine(qr)].push_back(2); int y=0; if(v[0].size()<2)y=1; qr.clear(); qr.push_back(v[y][0]); qr.push_back(3); qr.push_back(v[y][1]); qr.push_back(4); int ans=use_machine(qr); v[(ans/2+y)%2].push_back(3); v[(ans+y)%2].push_back(4); int x=0; if(v[0].size()<3)x=1; int bu=45; for(int i=1;i<bu;i++) { vector<int>q; q.push_back(v[x][0]);q.push_back(5*i);q.push_back(v[x][1]);q.push_back(5*i+1);q.push_back(v[x][2]);q.push_back(5*i+2); int ans=use_machine(q); if(ans/2==1) { v[(ans+x)%2].push_back(5*i+2); if(v[1-x].size()<2) { vector<int>qr; qr.push_back(v[x][0]); qr.push_back(5*i+3); qr.push_back(v[x][1]); qr.push_back(5*i+4); int ans=use_machine(qr); v[(ans/2+x)%2].push_back(5*i+3); v[(ans+x)%2].push_back(5*i+4); qr.clear(); qr.push_back(v[x][0]); qr.push_back(5*i); ans=use_machine(qr); v[(ans+x)%2].push_back(5*i); v[(ans+x+1)%2].push_back(5*i+1); } else { vector<int>qr; qr.push_back(v[1-x][0]); qr.push_back(5*i); qr.push_back(v[1-x][1]); qr.push_back(v[x][0]); qr.push_back(5*i+1); qr.push_back(v[x][1]); qr.push_back(5*i+3); qr.push_back(v[x][2]); qr.push_back(5*i+4); int ans=use_machine(qr); ans--; v[(ans/4+x+1)%2].push_back(5*i); v[(ans/4+x)%2].push_back(5*i+1); ans%=4; v[(ans/2+x)%2].push_back(5*i+3); v[(ans+x)%2].push_back(5*i+4); } } else { v[(ans/4+x)%2].push_back(5*i); v[(ans/4+x)%2].push_back(5*i+1); v[(ans+x)%2].push_back(5*i+2); vector<int>qr; qr.push_back(v[x][0]); qr.push_back(5*i+3); qr.push_back(v[x][1]); qr.push_back(5*i+4); int ans=use_machine(qr); v[(ans/2+x)%2].push_back(5*i+3); v[(ans+x)%2].push_back(5*i+4); } } int jump; int ret=v[0].size(); for(int i=5*bu;i<n;i+=jump) { int k; if(v[0].size()>v[1].size()) { k=0; jump=v[0].size(); } else { k=1; jump=v[1].size(); } vector<int>quer; for(int j=i;j<min(i+jump, n);j++) { quer.push_back(v[k][j-i]); quer.push_back(j); } int ans=use_machine(quer); if(k)ret+=(ans/2+ans%2); else ret-=(ans/2+ans%2),ret+=(min(i+jump, n)-i); v[(ans%2)^k].push_back(min(i+jump, n)-1); } return ret; }
#Verdict Execution timeMemoryGrader output
Fetching results...