Submission #1080647

#TimeUsernameProblemLanguageResultExecution timeMemory
1080647Faisal_SaqibCounting Mushrooms (IOI20_mushrooms)C++17
92.24 / 100
7 ms856 KiB
#include "mushrooms.h" #include <bits/stdc++.h> using namespace std; mt19937 RNG(chrono::steady_clock::now().time_since_epoch().count()); #define SHUFFLE(v) shuffle(begin(v),end(v), RNG); int count_mushrooms(int n) { std::vector<int> ind[2]; ind[0].push_back(0); int sq=66; int rem_i=1; vector<int> order_fake; for(int j=1;j<n;j++) order_fake.push_back(j); SHUFFLE(order_fake); vector<int> order={0}; for(auto j:order_fake) order.push_back(j); for(int i=1;i<n and max(ind[0].size(),ind[1].size())<sq;i++,rem_i++) { if(ind[0].size()>=2 and (i+1)<n) { int i0=order[i],i1=order[i+1]; vector<int> query={ind[0][0],i0,ind[0][1],i1}; int x=use_machine(query); if((x&1)==1) { ind[1].push_back(i1); } else { ind[0].push_back(i1); } if((x&2)==2) { ind[1].push_back(i0); } else { ind[0].push_back(i0); } i++; rem_i++; } else if(ind[1].size()>=2 and (i+1)<n) { int i0=order[i],i1=order[i+1]; vector<int> query={ind[1][0],i0,ind[1][1],i1}; int x=3-use_machine(query); if((x&1)==1) { ind[1].push_back(i1); } else { ind[0].push_back(i1); } if((x&2)==2) { ind[1].push_back(i0); } else { ind[0].push_back(i0); } i++; rem_i++; } else { int i0=order[i]; ind[0].push_back(i0); int x=use_machine(ind[0]); ind[0].pop_back(); if(x==0) { ind[0].push_back(i0); } else { ind[1].push_back(i0); } } } int ans=ind[0].size(); for(int i=rem_i;i<n;) { if(ind[0].size()>=ind[1].size()) { vector<int> query; int rem=min(n-i,(int)ind[0].size()); for(int j=0;j<rem;j++) { query.push_back(ind[0][j]); query.push_back(order[i+j]); } int x=use_machine(query); int ones=(x+1)/2; int zeros=rem-ones; ans+=zeros; if(zeros==0) { for(int j=1;j<query.size();j+=2) { ind[1].push_back(query[j]); } } else if(zeros==rem) { for(int j=1;j<query.size();j+=2) { ind[0].push_back(query[j]); } } else { if(x%2==0) { ind[0].push_back(order[i+rem-1]); } else { ind[1].push_back(order[i+rem-1]); } } i+=rem; } else { vector<int> query; int rem=min(n-i,(int)ind[1].size()); for(int j=0;j<rem;j++) { query.push_back(ind[1][j]); query.push_back(order[i+j]); } int x=use_machine(query); int zeros=(x+1)/2; ans+=zeros; if(zeros==0) { for(int j=1;j<query.size();j+=2) { ind[1].push_back(query[j]); } } else if(zeros==rem) { for(int j=1;j<query.size();j+=2) { ind[0].push_back(query[j]); } } else { if(x%2==1) { ind[0].push_back(order[i+rem-1]); } else { ind[1].push_back(order[i+rem-1]); } } i+=rem; } } return ans; }

Compilation message (stderr)

mushrooms.cpp: In function 'int count_mushrooms(int)':
mushrooms.cpp:18:54: warning: comparison of integer expressions of different signedness: 'const long unsigned int' and 'int' [-Wsign-compare]
   18 |  for(int i=1;i<n and max(ind[0].size(),ind[1].size())<sq;i++,rem_i++)
      |                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
mushrooms.cpp:102:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  102 |     for(int j=1;j<query.size();j+=2)
      |                 ~^~~~~~~~~~~~~
mushrooms.cpp:109:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  109 |     for(int j=1;j<query.size();j+=2)
      |                 ~^~~~~~~~~~~~~
mushrooms.cpp:141:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  141 |     for(int j=1;j<query.size();j+=2)
      |                 ~^~~~~~~~~~~~~
mushrooms.cpp:148:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  148 |     for(int j=1;j<query.size();j+=2)
      |                 ~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...