Submission #679334

#TimeUsernameProblemLanguageResultExecution timeMemory
679334That_SalamanderCounting Mushrooms (IOI20_mushrooms)C++14
80.71 / 100
10 ms384 KiB
#include <bits/stdc++.h> #include <cstdarg> #include <cstdio> #include <cstdlib> #include <string> using namespace std; int use_machine(std::vector<int> x); /* 1 => 80.427 2 => 80.427 33 => 79.8587 66 => 78.4722 100 => 75.8389 200 => 65.6977 */ #define PREGEN 1 int count_mushrooms(int n) { vector<int> as = {0}, bs; int i; for (i = 1; i < PREGEN && i < n; i++) { if (use_machine({0, i})) { bs.push_back(i); } else { as.push_back(i); } } int count = as.size(); while (i < n) { vector<int>* use = &as; bool swapped = false; if (bs.size() > as.size()) { use = &bs; swapped = true; } int m = use->size(); int process = min(m, n - i); vector<int> machine(process * 2); for (int j = 0; j < process; j++) { machine[j * 2] = (*use)[j]; } for (int j = 0; j < process; j++) { machine[j * 2 + 1] = i + j; } int res = use_machine(machine); int num = (res + 1) / 2; if (!swapped) { num = process - num; } count += num; i += process; if ((res & 1) ^ swapped) { bs.push_back(i-1); } else { as.push_back(i-1); } } return count; } #ifdef LOCAL_TEST #include <random> #include <time.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++) { if (used[x[i]]) { cout << "Duplicate value in the query array." << endl; exit(0); } 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); } void createRandom() { n = 20000; species.resize(n); for (int& x : species) x = rand() % 2; species[0] = 0; } 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. */ float best = 100.0; float longest = 0.0; for (int i = 0; i < 1000; i++) { createRandom(); qc = 0; qs = 0; auto start = clock(); int answer = count_mushrooms(n); auto end = clock(); int actual = 0; for (int x: species) if(!x) actual++; float score; if (actual != answer) { cout << "WRONG ANSWER!" << endl; score = 0; } else if (qc > 20000) { score = 0; } else if (qc > 10010) { score = 10; } else if (qc > 904) { score = 25; } else if (qc > 226) { score = 226.0 / qc * 100.0; } else { score = 100; } //cout << "Score: " << score << " Guesses = " << qc << " Execution Time = " << (int) (((end - start) / (float) CLOCKS_PER_SEC) * 1000000) << " us" << endl; longest = max(longest, ((end - start) / (float) CLOCKS_PER_SEC)); best = min(score, best); } cout << "Final Score: " << best << endl; cout << "Max Time: " << longest << " s" << endl; } #endif
#Verdict Execution timeMemoryGrader output
Fetching results...