Submission #1309308

#TimeUsernameProblemLanguageResultExecution timeMemory
1309308zzzzzzzzzzzzzzzCounting Mushrooms (IOI20_mushrooms)C++20
100 / 100
4 ms432 KiB
/*#include <vector> int count_mushrooms(int n); int use_machine(std::vector<int> x); #include <cstdio> #include <cstdlib> #include <cstdarg> #include <string> #include "mushrooms.h" static char fmt_buffer[100000]; #define FMT_TO_STR(fmt, result) va_list vargs; va_start(vargs, fmt); \ vsnprintf(fmt_buffer, sizeof(fmt_buffer), fmt, vargs); \ va_end(vargs); fmt_buffer[sizeof(fmt_buffer)-1] = 0; \ std::string result(fmt_buffer); static const int min_n = 2; static const int max_n = 20000; static const int max_qc = 20000; static const int max_qs = 100000; static const int species_A = 0; static const int species_B = 1; static int n; static std::vector<int> species; static int qc, qs; static inline void error_if(bool cond, std::string message) { if (cond) { printf("%s\n", message.c_str()); exit(0); } } static inline void wrong_if(bool cond, std::string message) { error_if(cond, "Wrong Answer: "+message); } int use_machine(std::vector<int> x) { const int xs = x.size(); wrong_if(xs < 2, "Too small array for query."); wrong_if(xs > n, "Too large array for query."); qc++; wrong_if(qc > max_qc, "Too many queries."); qs += xs; wrong_if(qs > max_qs, "Too many total array sizes as queries."); for (int i = 0; i < xs; i++) wrong_if(x[i] < 0 || n - 1 < x[i], "Invalid value in the query array."); std::vector<bool> used(n, false); for (int i = 0; i < xs; i++) { wrong_if(used[x[i]], "Duplicate value in the query array."); used[x[i]] = true; } int diffs = 0; for (int i = 1; i < xs; i++) diffs += int(species[x[i]] != species[x[i-1]]); return diffs; } #ifdef __GNUC__ __attribute__ ((format(printf, 2, 3))) #endif static inline void check_input(bool cond, const char* message_fmt, ...) { FMT_TO_STR(message_fmt, message); error_if(!cond, "Invalid input: "+message); } int main() { check_input(1 == scanf("%d", &n), "Could not read n."); check_input(min_n <= n, "n must not be less than %d, but it is %d.", min_n, n); check_input(n <= max_n, "n must not be greater than %d, but it is %d.", max_n, n); species.resize(n); for (int i = 0; i < n; i++) { check_input(1 == scanf("%d", &species[i]), "Could not read species element [%d].", i); check_input(species[i]==species_A || species[i] == species_B, "Species elements must be %d or %d, but species element [%d] is %d.", species_A, species_B, i, species[i]); } check_input(species[0] == species_A, "Species element [%d] must be %d.", 0, species_A); // Postponed closing standard input in order to allow interactive usage of the grader. qc = 0; qs = 0; int answer = count_mushrooms(n); printf("%d\n%d\n", answer, qc); fclose(stdout); fclose(stdin); return 0; } */ #include "mushrooms.h" #include <bits/stdc++.h> using namespace std; vector<int> v[2]; int ans[2]; void solve1(int a, int b, int ty){ int r=use_machine({v[ty][0],a,v[ty][1],b}); v[(r>>1)^ty].push_back(a); v[(r&1)^ty].push_back(b); } int solve2(int a, int b, int c, int d, int e, int ty) { int r = use_machine({a,v[ty][0],b,v[ty][1],c,v[ty][2]}); v[ty^(r&1)].push_back(a); r/=2; if(r==2) { v[ty^1].push_back(b); v[ty^1].push_back(c); return 3; } if(r==0) { v[ty].push_back(b); v[ty].push_back(c); return 3; } r=use_machine({v[ty^1][0],b,v[ty^1][1],v[ty][0],c,v[ty][1],d,v[ty][2],e})-1; v[ty^(r&1)].push_back(e); r/=2; v[ty^(r&1)].push_back(d); r/=2; v[ty^r].push_back(c); v[ty^r^1].push_back(b); return 5; } int count_mushrooms(int n) { int bu=200; v[0].push_back(0);//v[0] ali, v[1] bli int idx=1; while(idx<=min(n-1,bu)) { ans[0]=v[0].size(); ans[1]=v[1].size(); if(idx<=n-5 && ((ans[1]>2 && ans[0]>1) || (ans[0]>2 && ans[1]>1))) { idx+=solve2(idx, idx+1, idx+2, idx+3, idx+4, ans[1]>2 && ans[0]>1); } else if(idx<=n-2 && (ans[0]>1 || ans[1]>1)){ solve1(idx,idx+1,ans[1]>1); idx+=2; } else { v[use_machine({0,idx})].push_back(idx); idx++; } } ans[0]=v[0].size(); ans[1]=v[1].size(); while(idx<n){ int ty=v[1].size()>v[0].size(); vector<int> q; int cnt=0, t=min(n,idx+(int)v[ty].size()); for (int j=idx;j<t;j++){ q.push_back(j); q.push_back(v[ty][j-idx]); cnt++; } int r=use_machine(q), d=(r+1)/2; ans[ty^1]+=d; ans[ty]+=cnt-d; v[(r&1)^ty].push_back(idx); idx=t; } return ans[0]; }
#Verdict Execution timeMemoryGrader output
Fetching results...