Submission #759940

#TimeUsernameProblemLanguageResultExecution timeMemory
759940raysh07Counting Mushrooms (IOI20_mushrooms)C++17
0 / 100
0 ms208 KiB
#include "mushrooms.h"
#include <bits/stdc++.h>
using namespace std;
 
int count_mushrooms(int n) {
// 	std::vector<int> m;
// 	for (int i = 0; i < n; i++)
// 		m.push_back(i);
// 	int c1 = use_machine(m);
// 	m = {0, 1};
// 	int c2 = use_machine(m);
// 	return c1+c2;

    // if (n <= 5000){
    // vector <int> a, b;
    // a.push_back(0);
    // int N = min(200, n);
    
    // for (int i = 1; i < N; i++){
    //     vector <int> m = {0, i};
    //     int c = use_machine(m);
        
    //     if (c == 0) a.push_back(i);
    //     else b.push_back(i);
    // }
    
    // if (N == n) return a.size();
    // int ans = 0;
    
    // while (N < n){
    //     int x = min(N + 99, n - 1);
    //     int add = x - N + 1;
        
    //     if (a.size() >= 100){
    //         vector <int> m;
    //         for (int i = 0; i < add; i++){
    //             m.push_back(a[i]);
    //             m.push_back(N + i);
    //         }
            
    //         int c = use_machine(m);
    //         //every B will add 2, except for 1 
    //         c++;
    //         int bb = c/2;
    //         int aa = add - bb;
    //         ans += aa;
    //     } else {
    //         assert(b.size() >= 100);
    //         vector <int> m;
    //         for (int i = 0; i < add; i++){
    //             m.push_back(b[i]);
    //             m.push_back(N + i);
    //         }
            
    //         int c = use_machine(m) + 1;
    //         ans += c/2;
    //     }
        
    //     N = x + 1;
    // }
    
    // return ans + a.size();
    // }
    
    vector <int> a, b;
    a.push_back(0);
    int p = 1;
    int ans = 0;
    
    while (p < n){
        if (a.size() > b.size()){
            int g = a.size();
            g = min(g, n - p);
            
            vector <int> m;
            for (int i = 0; i < g; i++){
                m.push_back(p + i);
                m.push_back(a[i]);
            }
            
            int c = use_machine(m);
            if (c & 1) b.push_back(p), c--;
            else a.push_back(p);
            
            ans += g - c/2;
            p += g;
        } else {
            int g = b.size();
            g = min(g, n - p);
            
            vector <int> m;
            for (int i = 0; i < g; i++){
                m.push_back(p + i);
                m.push_back(b[i]);
            }
            
            int c = use_machine(m);
            if (c & 1) a.push_back(p), c--;
            else b.push_back(p);
            
            ans += c/2;
            p += g;
        }
    }
    
    return ans + a.size();
}
#Verdict Execution timeMemoryGrader output
Fetching results...