Submission #1105699

#TimeUsernameProblemLanguageResultExecution timeMemory
1105699azberjibiouCounting Mushrooms (IOI20_mushrooms)C++17
51.83 / 100
9 ms764 KiB
#include "mushrooms.h" #include <bits/stdc++.h> #define all(v) v.begin(), v.end() #define pb push_back #define lb lower_bound #define gibon ios::sync_with_stdio(false); cin.tie(0); #define fi first #define se second #define pii pair<int, int> #define pll pair<ll, ll> typedef long long ll; using namespace std; const int mxN=505; const int mxM=2200005; const int mxK=61; const int MOD=1e9+7; const ll INF=1e18; const int C=130; vector <int> A, B; int cntA; int idx=1; void check_one(){ int val=use_machine(vector <int>{0, idx}); if(val==0) A.push_back(idx); else B.push_back(idx); idx++; } void check_two(){ assert(A.size()>=2 || B.size()>=2); bool swp=false; if(A.size()<2){ swp=true; swap(A, B); } int val=use_machine(vector <int> {A[0], idx, A[1], idx+1}); if(val%2==1) B.push_back(idx+1); else A.push_back(idx+1); if(val>=2) B.push_back(idx); else A.push_back(idx); idx+=2; if(swp) swap(A, B); } void check_C(){ bool swp=false; if(A.size()<B.size()){ swp=true; swap(A, B); } vector <int> v; for(int i=0;i<A.size();i++){ v.push_back(A[i]); v.push_back(idx+i); } int val=use_machine(v); int sz=A.size(); //end element if(val%2==0) A.push_back(idx+sz-1); else B.push_back(idx+sz-1); //middle element if(swp) cntA+=val/2; else cntA+=sz-1-val/2; //maintain idx, A, B idx+=sz; if(swp) swap(A, B); } void check_end(int n){ bool swp=false; if(A.size()<B.size()){ swp=true; swap(A, B); } vector <int> v; for(int i=0;i<A.size();i++){ v.push_back(A[i]); if(idx+i<n) v.push_back(idx+i); } int val=use_machine(v); int sz=A.size(), cnt_mid=max(n-idx, sz-1); if(n==idx+sz){ if(val%2==0) A.push_back(idx+sz-1); else B.push_back(idx+sz-1); } if(swp) cntA+=val/2; else cntA+=cnt_mid-val/2; if(swp) swap(A, B); idx=n; } int count_mushrooms(int n) { A.push_back(0); check_one(); if(n==2) return A.size(); if(A.size()==1) check_one(); while(A.size()<C && B.size()<C){ if(idx==n) return A.size(); else if(idx==n-1) check_one(); else check_two(); } while(idx<n){ if(n-idx<=max(A.size(), B.size())) check_one(); else check_C(); } return A.size()+cntA; }

Compilation message (stderr)

mushrooms.cpp: In function 'void check_C()':
mushrooms.cpp:50:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |     for(int i=0;i<A.size();i++){
      |                 ~^~~~~~~~~
mushrooms.cpp: In function 'void check_end(int)':
mushrooms.cpp:73:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   73 |     for(int i=0;i<A.size();i++){
      |                 ~^~~~~~~~~
mushrooms.cpp: In function 'int count_mushrooms(int)':
mushrooms.cpp:99:17: warning: comparison of integer expressions of different signedness: 'int' and 'const long unsigned int' [-Wsign-compare]
   99 |         if(n-idx<=max(A.size(), B.size())) check_one();
      |            ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...