Submission #468860

#TimeUsernameProblemLanguageResultExecution timeMemory
468860vectorCounting Mushrooms (IOI20_mushrooms)C++17
100 / 100
10 ms340 KiB
#include "mushrooms.h" #include <bits/stdc++.h> #define BUCKET 200 using namespace std; vector<int> A[3]; int count_mushrooms(int N) { int ret=0, idx=5, z, x, b[5]; vector<int> v; A[0].push_back(0); if (N<=2*BUCKET) { for (int i=1; i<N-1; i+=2) { v.push_back(i); v.push_back(0); v.push_back(i+1); z=use_machine(v); v.clear(); ret+=z; } if (N%2==0) { v.push_back(N-1); v.push_back(0); z=use_machine(v); v.clear(); ret+=z; } return N-ret; } v.push_back(0); v.push_back(1); z=use_machine(v); v.clear(); if (z==1) A[1].push_back(1); else A[0].push_back(1); v.push_back(0); v.push_back(2); z=use_machine(v); v.clear(); if (z==1) A[1].push_back(2); else A[0].push_back(2); if (A[0].size()>=2) { v.push_back(A[0][0]); v.push_back(3); v.push_back(A[0][1]); v.push_back(4); z=use_machine(v); v.clear(); if (z>=2) A[1].push_back(3); else A[0].push_back(3); if (z%2==1) A[1].push_back(4); else A[0].push_back(4); } else { v.push_back(A[1][0]); v.push_back(3); v.push_back(A[1][1]); v.push_back(4); z=use_machine(v); v.clear(); if (z>=2) A[0].push_back(3); else A[1].push_back(3); if (z%2==1) A[0].push_back(4); else A[1].push_back(4); } for (int i=5; i<BUCKET; i+=5) { for (int j=0; j<5; j++) b[j]=i+j; if (A[0].size()>=3) x=0; else x=1; v.push_back(A[x][0]); v.push_back(b[0]); v.push_back(A[x][1]); v.push_back(b[1]); v.push_back(A[x][2]); v.push_back(b[2]); z=use_machine(v); v.clear(); if (z%2==1) A[1-x].push_back(b[2]); else A[x].push_back(b[2]); z-=z%2; if (z%4==0) { if (z==0) { A[x].push_back(b[0]); A[x].push_back(b[1]); } if (z==4) { A[1-x].push_back(b[0]); A[1-x].push_back(b[1]); } v.push_back(A[x][0]); v.push_back(b[3]); v.push_back(A[x][1]); v.push_back(b[4]); z=use_machine(v); v.clear(); if (z>=2) A[1-x].push_back(b[3]); else A[x].push_back(b[3]); if (z%2==1) A[1-x].push_back(b[4]); else A[x].push_back(b[4]); } else { assert(z==2); if (min(A[0].size(), A[1].size())>=2) { v.push_back(A[1-x][0]); v.push_back(b[0]); v.push_back(A[1-x][1]); v.push_back(A[x][0]); v.push_back(b[1]); v.push_back(A[x][1]); v.push_back(b[3]); v.push_back(A[x][2]); v.push_back(b[4]); z=use_machine(v); v.clear(); if (z%2==0) A[1-x].push_back(b[4]); else A[x].push_back(b[4]); if (z%2==0) z--; if (z>=4) { assert(z==5 || z==7); A[x].push_back(b[0]); A[1-x].push_back(b[1]); if (z==5) A[x].push_back(b[3]); else A[1-x].push_back(b[3]); } else { assert(z==1 || z==3); A[1-x].push_back(b[0]); A[x].push_back(b[1]); if (z==1) A[x].push_back(b[3]); else A[1-x].push_back(b[3]); } } else { v.push_back(A[x][0]); v.push_back(b[0]); z=use_machine(v); v.clear(); if (z==1) { A[1-x].push_back(b[0]); A[x].push_back(b[1]); } else { A[x].push_back(b[0]); A[1-x].push_back(b[1]); } v.push_back(A[x][0]); v.push_back(b[3]); v.push_back(A[x][1]); v.push_back(b[4]); z=use_machine(v); v.clear(); if (z>=2) A[1-x].push_back(b[3]); else A[x].push_back(b[3]); if (z%2==1) A[1-x].push_back(b[4]); else A[x].push_back(b[4]); } } } idx=BUCKET; while (idx<N) { if (A[0].size()>=A[1].size()) { for (int i=0; i<A[0].size(); i++) { v.push_back(idx++); v.push_back(A[0][i]); if (idx==N) break; } z=use_machine(v); ret+=z/2; if (z%2) A[1].push_back(v[0]); else A[0].push_back(v[0]); } else { for (int i=0; i<A[1].size(); i++) { v.push_back(idx++); v.push_back(A[1][i]); if (idx==N) break; } z=use_machine(v); ret+=v.size()/2-1-z/2; if (z%2) A[0].push_back(v[0]); else A[1].push_back(v[0]); } v.clear(); } return N-ret-A[1].size(); }

Compilation message (stderr)

mushrooms.cpp: In function 'int count_mushrooms(int)':
mushrooms.cpp:108:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  108 |             for (int i=0; i<A[0].size(); i++) {
      |                           ~^~~~~~~~~~~~
mushrooms.cpp:119:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  119 |             for (int i=0; i<A[1].size(); i++) {
      |                           ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...