Submission #314673

#TimeUsernameProblemLanguageResultExecution timeMemory
314673neizodCounting Mushrooms (IOI20_mushrooms)C++17
100 / 100
9 ms392 KiB
// WIP: REFACTORING

#include "mushrooms.h"
#include <bits/stdc++.h>

using namespace std;

//int use_machine(vector<int> x);


const int M = 100;


void partV1(int &i, vector<int> &A, vector<int> &B, int &count_A, int &count_B){
    while(count_A < 2 && count_B < 2){
        vector<int> x = { 0, i };
        //x.push_back(0);
        //x.push_back(i);
        int result = use_machine(x);
        if(result == 0){
            A.push_back(i);
            count_A++;
        }
        else{
            B.push_back(i);
            count_B++;
        }
        i++;
    }
}


void partV2(int &i, vector<int> &A, vector<int> &B, int &count_A, int &count_B){
    // TODO while condition
    while ((count_A < 3 || count_B < 2) && (count_A < 2 || count_B < 3) && count_A < M && count_B < M){
        bool swapped = false;
        if (count_A < count_B) {
            swapped = true;
            swap(A, B);
            swap(count_A, count_B);
        }
        vector<int> x = { i, A[0], i+1, A[1] };
        //x.push_back(i);
        //x.push_back(A[0]);
        //x.push_back(i+1);
        //x.push_back(A[1]);
        int result = use_machine(x);
        switch(result){
            case 0:
                A.push_back(i);
                A.push_back(i+1);
                count_A += 2;
                break;
            case 1:
                B.push_back(i);
                A.push_back(i+1);
                count_A++;
                count_B++;
                break;
            case 2:
                A.push_back(i);
                B.push_back(i+1);
                count_A++;
                count_B++;
                break;
            default:
                B.push_back(i);
                B.push_back(i+1);
                count_B += 2;
        }
        if (swapped) {
            swap(A, B);
            swap(count_A, count_B);
        }
        i += 2;
    }
}


void partV3(int &i, vector<int> &A, vector<int> &B, int &count_A, int &count_B){
    while(count_A < M && count_B < M){
        bool swapped = false;
        if(count_A < count_B){
            swapped = true;
            swap(A, B);
            swap(count_A, count_B);
        }
        vector<int> x = { i, A[0], i+1, A[1], i+2, A[2] };
        //x.push_back(i);
        //x.push_back(A[0]);
        //x.push_back(i+1);
        //x.push_back(A[1]);
        //x.push_back(i+2);
        //x.push_back(A[2]);

        int result = use_machine(x);
        if (result%2 == 0){
            A.push_back(i);
            count_A++;
        } else {
            B.push_back(i);
            count_B++;
        }

        if (result-result%2 == 0){
            A.push_back(i+1);
            A.push_back(i+2);
            count_A += 2;
            i += 3;
        } else if(result-result%2 == 4){
            B.push_back(i+1);
            B.push_back(i+2);
            count_B += 2;
            i += 3;
        } else {
            vector<int> x = { B[0], i+1, B[1], A[0], i+2, A[1], i+3, A[2], i+4 };
            //x.push_back(B[0]);
            //x.push_back(i+1);
            //x.push_back(B[1]);
            //x.push_back(A[0]);
            //x.push_back(i+2);
            //x.push_back(A[1]);
            //x.push_back(i+3);
            //x.push_back(A[2]);
            //x.push_back(i+4);

            int result = use_machine(x);
            switch(result){
                case 1:
                    B.push_back(i+1);
                    A.push_back(i+2);
                    A.push_back(i+3);
                    A.push_back(i+4);
                    count_A += 3;
                    count_B += 1;
                    break;
                case 2:
                    B.push_back(i+1);
                    A.push_back(i+2);
                    A.push_back(i+3);
                    B.push_back(i+4);
                    count_A += 2;
                    count_B += 2;
                    break;
                case 3:
                    B.push_back(i+1);
                    A.push_back(i+2);
                    B.push_back(i+3);
                    A.push_back(i+4);
                    count_A += 2;
                    count_B += 2;
                    break;
                case 4:
                    B.push_back(i+1);
                    A.push_back(i+2);
                    B.push_back(i+3);
                    B.push_back(i+4);
                    count_A += 1;
                    count_B += 3;
                    break;
                case 5:
                    A.push_back(i+1);
                    B.push_back(i+2);
                    A.push_back(i+3);
                    A.push_back(i+4);
                    count_A += 3;
                    count_B += 1;
                    break;
                case 6:
                    A.push_back(i+1);
                    B.push_back(i+2);
                    A.push_back(i+3);
                    B.push_back(i+4);
                    count_A += 2;
                    count_B += 2;
                    break;
                case 7:
                    A.push_back(i+1);
                    B.push_back(i+2);
                    B.push_back(i+3);
                    A.push_back(i+4);
                    count_A += 2;
                    count_B += 2;
                    break;
                default:
                    A.push_back(i+1);
                    B.push_back(i+2);
                    B.push_back(i+3);
                    B.push_back(i+4);
                    count_A += 1;
                    count_B += 3;
            }
            i += 5;
        }

        if (swapped) {
            swap(A, B);
            swap(count_A, count_B);
        }
    }
}


void partV4(int &i, int &n, vector<int> &A, vector<int> &B, int &count_A, int &count_B){
    while(i < n){
        bool swapped = false;
        if(A.size() < B.size()){
            swapped = true;
            swap(A, B);
            swap(count_A, count_B);
        }

        vector<int> x;
        int L = min((int)A.size(), n-i);
        for(int j=0;j<L;j++){
            x.push_back(i+j);
            x.push_back(A[j]);
        }

        int result = use_machine(x);
        if(result%2 == 0){
            A.push_back(i);
            count_A++;
        } else {
            B.push_back(i);
            count_B++;
        }
        count_B += result/2;
        count_A += (L-1) - result/2;

        if (swapped) {
            swap(A, B);
            swap(count_A, count_B);
        }
        i += L;
    }
}


int count_mushrooms(int n){
    vector<int> A = { 0 };
    vector<int> B = {};
    int count_A = 1, count_B = 0;
    int i = 1;

    if (n <= 226) {
        while(i < n){
            vector<int> x;
            x.push_back(0);
            x.push_back(i);
            int result = use_machine(x);
            if(result == 0){
                A.push_back(i);
                count_A++;
            }
            else{
                B.push_back(i);
                count_B++;
            }
            i++;
        }
        return count_A;
    }

    partV1(i, A, B, count_A, count_B);
    partV2(i, A, B, count_A, count_B);
    partV3(i, A, B, count_A, count_B);
    partV4(i, n, A, B, count_A, count_B);
    return count_A;
}
#Verdict Execution timeMemoryGrader output
Fetching results...