Submission #311082

#TimeUsernameProblemLanguageResultExecution timeMemory
311082Lemur95Counting Mushrooms (IOI20_mushrooms)C++17
92.62 / 100
12 ms384 KiB
#include <bits/stdc++.h> #include "mushrooms.h" #pragma GCC optimize("Ofast") #define x first #define y second #define ld long double #define ll long long using namespace std; const int X = 146; int q; vector <bool> s; vector <vector <int>> p(2); /*int use_machine(vector <int> v) { int ans = 0; q++; for(int i = 1; i < v.size(); i++) ans += (s[v[i]] != s[v[i - 1]]); return ans; }*/ void add(int ind, int i, int &ans) { ans += (ind == 0); p[ind].push_back(i); } int count_mushrooms(int n) { vector <int> q; p[0].clear(); p[1].clear(); int x, ans = 1; if(n <= X) { for(int i = 1; i < n; i++) { q.clear(); q.push_back(0), q.push_back(i); x = use_machine(q); ans += (x == 0); } return ans; } p[0].push_back(0); for(int i = 1; i < 3; i++) { q.clear(); q.push_back(0), q.push_back(i); x = use_machine(q); add(x, i, ans); } int a = (p[0].size() >= 2 ? 0 : 1), b = 1 - a; for(int i = 3; i <= X; i += 2) { q.clear(); q.push_back(i), q.push_back(p[a][0]), q.push_back(i + 1), q.push_back(p[a][1]); x = use_machine(q); if(x % 2 == 0) add(a, i, ans); else add(b, i, ans); if(x <= 1) add(a, i + 1, ans); else add(b, i + 1, ans); } int i = X + 1; while(i < n) { a = (p[0].size() >= p[1].size() ? 0 : 1), b = 1 - a; int lim = min(n - i, (int)p[a].size()); q.clear(); for(int j = 0; j < lim; j++) q.push_back(i + j), q.push_back(p[a][j]); x = use_machine(q); if(x % 2 == 0) p[a].push_back(i); else p[b].push_back(i); i += lim; if(a == 0) { ans += lim - (x + 1) / 2; } else { ans += (x + 1) / 2; } } return ans; } /*int main() { int n, x; cin >> n; for(int i = 0; i < n; i++) cin >> x, s.push_back(x); cout << count_mushrooms(n); cout << " with " << q << " queries used"; return 0; } */
#Verdict Execution timeMemoryGrader output
Fetching results...