Submission #1105724

#TimeUsernameProblemLanguageResultExecution timeMemory
1105724azberjibiouCounting Mushrooms (IOI20_mushrooms)C++17
80.71 / 100
8 ms968 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=160; const double P=1.05; 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=min(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(idx<n){ if(n-idx<=max(A.size(), B.size())) check_end(n); else if(max(A.size(), B.size())*idx/max(1, (int)min(A.size(), B.size()))>P*C/226){ check_C(); } else check_two(); } return A.size()+cntA; }

Compilation message (stderr)

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