제출 #1244330

#제출 시각아이디문제언어결과실행 시간메모리
1244330santi3223Counting Mushrooms (IOI20_mushrooms)C++20
25 / 100
27 ms636 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; } */ 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(1); } ll k = 80, pos = 0; if(zero){ 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; } else if(x != 3){ c += 1; } if(x == 1){ z.pb(i+1); o.pb(i); } if(x == 2){ z.pb(i); o.pb(i+1); } if(x == 3){ o.pb(i); o.pb(i+1); } pos = i+2; } if(pos != k*2+1){ if(nn % 2 == 0){ if(use_machine({0, nn-1}) == 0){ c++; } } return c; } } else{ for(ll i = 3; 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; } if(pos != k*2+1){ if(nn % 2 == 0){ if(use_machine({0, nn-1}) == 0){ c++; } } return c; } } ll i = pos; while(i < nn){ vector<int> query; ll st = i; if(z.size() >= o.size()){ //TODOS 0s ll cant = 0; while(i < nn && cant < z.size()){ query.pb(i); query.pb(z[cant]); i++; cant++; } ll x = use_machine(query); if(x % 2 == 0){ z.pb(st); c++; } else{ o.pb(st); x--; } if(x == 0){ //cout << "ST0 " << st << " ES 0" << ed; continue; } int q = cant-1; //cout << "ST0 " << st << " = " << ((q*2)-x)/2 << ed; c += ((q*2)-x)/2; } else{ ll cant = 0; while(i < nn && cant < o.size()){ query.pb(i); query.pb(o[cant]); i++; cant++; } ll x = use_machine(query); if(x % 2 == 0){ o.pb(st); } else{ z.pb(st); x--; c++; } if(x == 0){ //cout << "ST1 " << st << " ES 0" << ed; continue; } //cout << "ST1 " << st << " = " << x/2 << ed; c += x/2; } } /*if(i < n-1){ cout << "Esto no deberia pasar"; }*/ 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; int answer = count_mushrooms(n); printf("%d\n%d\n", answer, qc); fclose(stdout); fclose(stdin); return 0; } */

컴파일 시 표준 에러 (stderr) 메시지

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