Submission #604782

#TimeUsernameProblemLanguageResultExecution timeMemory
604782SamAndCounting Mushrooms (IOI20_mushrooms)C++17
67.26 / 100
11 ms464 KiB
#include "mushrooms.h"
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define m_p make_pair
typedef long long ll;
mt19937 rnf(234);
const int M = 200;

int count_mushrooms(int n)
{
    vector<int> v;
    for (int i = 1; i < min(n, M); ++i)
        v.push_back(i);

    vector<int> a;
    vector<int> b;
    a.push_back(0);
    while (!v.empty())
    {
        if (sz(v) == 1)
        {
            int q = use_machine({0, v[0]});
            if (q == 0)
                a.push_back(v[0]);
            else
                b.push_back(v[0]);
            v.pop_back();
            break;
        }
        int x = v.back();
        v.pop_back();
        int y = v.back();
        v.pop_back();

        int q = use_machine({0, x, y});
        if (q == 0)
        {
            a.push_back(x);
            a.push_back(y);
        }
        else if (q == 2)
        {
            b.push_back(x);
            a.push_back(y);
        }
        else
        {
            b.push_back(y);
            v.push_back(x);
        }
    }

    int ans = sz(a);

    for (int i = M; i < n; ++i)
        v.push_back(i);
    if (sz(a) > sz(b))
    {
        while (!v.empty())
        {
            if (sz(v) < sz(a))
            {
                vector<int> x;
                x.push_back(a[0]);
                for (int i = 0; i < sz(v); ++i)
                {
                    x.push_back(v[i]);
                    x.push_back(a[i + 1]);
                }
                ans += (sz(v) - use_machine(x) / 2);
                v.clear();
            }
            else
            {
                vector<int> u;
                for (int i = 0; i < sz(a) - 1; ++i)
                {
                    u.push_back(v.back());
                    v.pop_back();
                }

                vector<int> x;
                x.push_back(a[0]);
                for (int i = 0; i < sz(u); ++i)
                {
                    x.push_back(u[i]);
                    x.push_back(a[i + 1]);
                }
                ans += (sz(u) - use_machine(x) / 2);
                u.clear();
            }
        }
    }
    else
    {
        while (!v.empty())
        {
            if (sz(v) < sz(b))
            {
                vector<int> x;
                x.push_back(b[0]);
                for (int i = 0; i < sz(v); ++i)
                {
                    x.push_back(v[i]);
                    x.push_back(b[i + 1]);
                }
                ans += use_machine(x) / 2;
                v.clear();
            }
            else
            {
                vector<int> u;
                for (int i = 0; i < sz(b) - 1; ++i)
                {
                    u.push_back(v.back());
                    v.pop_back();
                }

                vector<int> x;
                x.push_back(b[0]);
                for (int i = 0; i < sz(u); ++i)
                {
                    x.push_back(u[i]);
                    x.push_back(b[i + 1]);
                }
                ans += use_machine(x) / 2;
                u.clear();
            }
        }
    }

    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...