Submission #432623

#TimeUsernameProblemLanguageResultExecution timeMemory
432623Andyvanh1Counting Mushrooms (IOI20_mushrooms)C++14
92.62 / 100
12 ms460 KiB
#include <bits/stdc++.h> #include "mushrooms.h" using namespace std; #define vt vector #define pb push_back #define all(x) (x).begin(),(x).end() #define rep(i,x) for(int (i) = 0; (i) < (x); (i)++) typedef long long ll; typedef long double ld; typedef vt<int> vi; typedef pair<int,int> pii; int naive(int n){ int ans = 1; for(int i = 1; i < n; i++){ ans+=use_machine({0,i})^1; }return ans; } int count_mushrooms(int n){ if(n<=100)return naive(n); int h1; int h2; if(n==2){ return 2-use_machine({0,1}); } int val1 = use_machine({0,1}); int val2 = use_machine({0,2}); bool bol = true; if(val1==val2&&val1==1)h1 = 1, h2 = 2, bol = false; else { h1 = 0; if(!val1)h2=1; else h2 = 2; } int k = min(88,(int)sqrt(n)); vi count1 = {0}; vi count2; if(!val1)count1.pb(1); else count2.pb(1); if(!val2)count1.pb(2); else count2.pb(2); for(int i = 3; i < 2*k; i+=2){ int a = use_machine({h1,i,h2,i+1}); if(a==0){ if(bol){ count1.pb(i); count1.pb(i+1); }else{ count2.pb(i); count2.pb(i+1); } }else if(a==1){ if(bol){ count1.pb(i); count2.pb(i+1); }else{ count2.pb(i); count1.pb(i+1); } }else if(a==2){ if(bol){ count2.pb(i); count1.pb(i+1); }else{ count1.pb(i); count2.pb(i+1); } }else{ if(bol){ count2.pb(i); count2.pb(i+1); }else{ count1.pb(i); count1.pb(i+1); } } } int ans = count1.size(); int delta = 0; for(int i = 2*k+1; i < n; i+=max(count1.size(),count2.size())-delta){ int prr = max(count1.size(), count2.size()); if(n-i<max(count1.size(),count2.size())){ if(count2.size()>count1.size()){ vi cur; for(int j = 0; j < n-i; j++){ cur.pb(j+i); cur.pb(count2[j]); } int a = use_machine(cur); return ans + (a+1)/2; }else{ vi cur; for(int j = 0; j < n-i; j++){ cur.pb(j+i); cur.pb(count1[j]); } int a = use_machine(cur); return ans + n-i-(a+1)/2; } }else{ if(count2.size()>count1.size()){ vi cur; for(int j = 0; j < count2.size(); j++){ cur.pb(j+i); cur.pb(count2[j]); } int a = use_machine(cur); ans+=(a+1)/2; if(a%2==0){ count2.pb(i); }else{ count1.pb(i); } }else{ vi cur; for(int j = 0; j < count1.size(); j++){ cur.pb(j+i); cur.pb(count1[j]); } int a = use_machine(cur); ans+=count1.size()-(a+1)/2; if(a%2==0){ count1.pb(i); }else{ count2.pb(i); } } } delta = max(count1.size(),count2.size())-prr; } return ans; }

Compilation message (stderr)

mushrooms.cpp: In function 'int count_mushrooms(int)':
mushrooms.cpp:87:15: warning: comparison of integer expressions of different signedness: 'int' and 'const long unsigned int' [-Wsign-compare]
   87 |         if(n-i<max(count1.size(),count2.size())){
      |            ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mushrooms.cpp:111:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  111 |                 for(int j = 0; j < count2.size(); j++){
      |                                ~~^~~~~~~~~~~~~~~
mushrooms.cpp:125:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  125 |                 for(int j = 0; j < count1.size(); j++){
      |                                ~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...