Submission #1244388

#TimeUsernameProblemLanguageResultExecution timeMemory
1244388santi3223Counting Mushrooms (IOI20_mushrooms)C++20
92.62 / 100
3 ms448 KiB
#include <bits/stdc++.h> #include "mushrooms.h" using namespace std; #define ll long long #define vb vector<bool> #define pb push_back #define ff(aa, bb, cc) for(ll aa = bb; aa < cc; aa++) #define vl vector<ll> #define pll pair<ll, ll> #define fi first #define se second #define ed "\n" #define all(aaa) aaa.begin(), aaa.end() #define rall(aaa) aaa.rbegin(), aaa.rend() ll MOD = 1000000000; /* 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; } */ /* vector<int> abc; vl pref; void calc(vector<int> arr){ pref = vl(arr.size()); pref[0] = 1; ff(i, 1, arr.size()){ pref[i] = pref[i-1]; if(arr[i] == 0){ pref[i]++; } } }*/ int count_mushrooms(int nn) { int c = 1; if(nn == 2){ int query = use_machine({0, 1}); if(query == 0){ c++; } return c; } vector<int> z, o; z.pb(0); ll query1 = use_machine({0, 1}), query2 = use_machine({0, 2}); bool zero = false; ll id = 0; if(query1 == 0){ z.pb(1); zero = true; id = 1; c++; } else{ o.pb(1); } if(query2 == 0){ z.pb(2); id = 2; zero = true; c++; } else{ o.pb(2); } ll k = 85, pos = 0; if(zero){ //cout << "HAY 2 CEROS" << ed; for(ll i = 3; ((i/2) < k && i+1 < nn); i += 2){ int x = use_machine({i, 0, i+1, id}); if(x == 0){ z.pb(i); z.pb(i+1); c += 2; } if(x == 1){ o.pb(i); z.pb(i+1); c++; } if(x == 2){ z.pb(i); o.pb(i+1); c++; } if(x == 3){ o.pb(i); o.pb(i+1); } pos = i+2; /*cout << "I " << i << ed; cout << pref[i+1] << " " << c << ed; if(pref[i+1] != c){ cout << "ACA ^ ========================================================" << ed; ff(nw, 0, i+1){ cout << pref[nw] << " "; } cout << ed; } cout << i << " " << 0 << " " << i+1 << " " << id << ed; cout << abc[i] << " " << abc[0] << " " << abc[i+1] << " " << abc[id] << ed; cout << ed;*/ } if(pos != k*2+1){ if(nn % 2 == 0){ if(use_machine({0, nn-1}) == 0){ c++; } } return c; } } else{ //cout << "HAY 2 UNOS" << ed; for(ll i = 3; ((i/2) < k && i+1 < nn); i += 2){ int x = use_machine({i, 1, i+1, 2}); if(x == 3){ z.pb(i); z.pb(i+1); c += 2; } else if(x != 0){ c += 1; } if(x == 0){ o.pb(i); o.pb(i+1); } if(x == 1){ z.pb(i); o.pb(i+1); } if(x == 2){ o.pb(i); z.pb(i+1); } pos = i+2; /*cout << "I " << i << ed; cout << pref[i-1] << " " << c << ed; if(pref[i+1] != c){ cout << "ACA ^ ========================================================" << ed; ff(nw, 0, i+1){ cout << pref[nw] << " "; } cout << ed; } cout << i << " " << 0 << " " << i+1 << " " << id << ed; cout << abc[i] << " " << abc[0] << " " << abc[i+1] << " " << abc[id] << ed; cout << ed;*/ } if(pos != k*2+1){ if(nn % 2 == 0){ if(use_machine({0, nn-1}) == 0){ c++; } } return c; } } //cout << "===========================================" << ed; //cout << "POS " << pos << ed; ll i = pos; while(i < nn){ /*cout << "I " << i << ed; cout << pref[i-1] << " " << c << ed; if(pref[i-1] != c){ cout << "ACA ^ ========================================================" << ed; }*/ vector<int> query; ll st = i; if(z.size() >= o.size()){ //TODOS 0s //cout << "TODOS 0s" << ed; ll cant = 0; while(i < nn && cant < z.size()){ query.pb(i); query.pb(z[cant]); i++; cant++; } /*cout << "CANTPREV " << cant << ed; cout << "PENSADO" << ed; ff(qqq, 0, query.size()){ if(qqq % 2 == 0){ cout << "X "; } else{ cout << 0 << " "; } } cout << ed; cout << "REAL" << ed; bool ok = true; ff(qqq, 0, query.size()){ if(qqq % 2 != 0){ if(abc[query[qqq]] != 0){ ok = false; } } cout << abc[query[qqq]] << " "; } cout << ed; if(ok){ cout << "OK" << ed; } else{ cout << "NOT OK =================================================" << ed; }*/ ll x = use_machine(query); //cout << "XPREV " << x << ed; if(x % 2 == 0){ z.pb(st); c++; } else{ o.pb(st); x--; } cant--; //cout << "XAFTER " << x << ed; //cout << "CANT " << cant << ed; if(x == 0){ c += cant; //cout << "ES 0 " << ed; continue; } c += cant-(x/2); //((cant*2)-x)/2; //cout << cant << " - " << x << " " << "/2" << " = " << cant-(x/2) << ed; //cout << "IEND " << i << ed; //cout << ed; } else{ //cout << "TODOS 1s" << ed; ll cant = 0; while(i < nn && cant < o.size()){ query.pb(i); query.pb(o[cant]); i++; cant++; } /*cout << "CANTPREV " << cant << ed; cout << "PENSADO" << ed; ff(qqq, 0, query.size()){ if(qqq % 2 == 0){ cout << "X "; } else{ cout << 1 << " "; } } cout << ed; cout << "REAL" << ed; bool ok = true; ff(qqq, 0, query.size()){ if(qqq % 2 != 0){ if(abc[query[qqq]] != 1){ ok = false; } } cout << abc[query[qqq]] << " "; } cout << ed; if(ok){ cout << "OK" << ed; } else{ cout << "NOT OK =================================================" << ed; }*/ ll x = use_machine(query); //cout << "XPREV " << x << ed; if(x % 2 == 0){ o.pb(st); } else{ z.pb(st); x--; c++; } cant--; //cout << "XAFTER " << x << ed; //cout << "CANT " << cant << ed; if(x == 0){ //cout << "ES 0 " << ed; continue; } c += x/2; //cout << "IEND " << i << ed; //cout << ed; } } /*if(i < n-1){ cout << "Esto no deberia pasar"; } ff(i, 0, n){ cout << pref[i] << " "; } cout << ed; cout << c << ed << ed << ed; cout << "FIN" << ed;*/ return c; } /* #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; //calc(species); //abc = species; int answer = count_mushrooms(n); printf("%d\n", answer); //cout << "CALC " << pref[species.size()-1] << ed; fclose(stdout); fclose(stdin); return 0; } */

Compilation message (stderr)

mushrooms.cpp: In function 'int count_mushrooms(int)':
mushrooms.cpp:122:46: warning: narrowing conversion of 'i' from 'long long int' to 'int' [-Wnarrowing]
  122 |                         int x = use_machine({i, 0, i+1, id});
      |                                              ^
mushrooms.cpp:122:46: warning: narrowing conversion of 'i' from 'long long int' to 'int' [-Wnarrowing]
mushrooms.cpp:122:53: warning: narrowing conversion of '(i + 1)' from 'long long int' to 'int' [-Wnarrowing]
  122 |                         int x = use_machine({i, 0, i+1, id});
      |                                                    ~^~
mushrooms.cpp:122:53: warning: narrowing conversion of '(i + 1)' from 'long long int' to 'int' [-Wnarrowing]
mushrooms.cpp:122:57: warning: narrowing conversion of 'id' from 'long long int' to 'int' [-Wnarrowing]
  122 |                         int x = use_machine({i, 0, i+1, id});
      |                                                         ^~
mushrooms.cpp:122:57: warning: narrowing conversion of 'id' from 'long long int' to 'int' [-Wnarrowing]
mushrooms.cpp:171:46: warning: narrowing conversion of 'i' from 'long long int' to 'int' [-Wnarrowing]
  171 |                         int x = use_machine({i, 1, i+1, 2});
      |                                              ^
mushrooms.cpp:171:46: warning: narrowing conversion of 'i' from 'long long int' to 'int' [-Wnarrowing]
mushrooms.cpp:171:53: warning: narrowing conversion of '(i + 1)' from 'long long int' to 'int' [-Wnarrowing]
  171 |                         int x = use_machine({i, 1, i+1, 2});
      |                                                    ~^~
mushrooms.cpp:171:53: warning: narrowing conversion of '(i + 1)' from 'long long int' to 'int' [-Wnarrowing]
#Verdict Execution timeMemoryGrader output
Fetching results...