Submission #148888

#TimeUsernameProblemLanguageResultExecution timeMemory
148888USA1 (#200)Bulb Game (FXCUP4_bulb)C++17
100 / 100
103 ms18688 KiB
#include "bulb.h"
#include <bits/stdc++.h>

using namespace std;
const int MAXN = 300100;

int N;
int L[MAXN], R[MAXN];
vector <int> vs;
vector <int> hs;
int llim;
bool bbad[MAXN], hbad[MAXN];
bool bfull;
int nc[MAXN];

void flood (int cloc, int cdep)
{
    nc[cloc] = vs.size();
    if (cloc < 0)
    {
        if (cloc == -2)
        {
            if (vs.size() > 2)
                return;
            if (vs.size() == 0)
            {
                // gg
                llim = -100;
            }
            else if (vs.size() == 1)
            {
                // can't intercept after, or at unless this is the full path
                if (cdep == N)
                {
                    // must go at or before here
                    llim = min (llim, vs[0]);
                }
                else
                {
                    // must go before here
                    llim = min (llim, vs[0] - 1);
                }
            }
            else
            {
                int lo = hs[0], hi = hs[1];
                hbad[lo] = hbad[hi] = true;
            }
        }
        return;
    }

    flood (L[cloc], cdep + 1);
    vs.push_back(cdep);
    hs.push_back(cloc);
    flood (R[cloc], cdep + 1);
    vs.pop_back();
    hs.pop_back();
}

int FindWinner(int T, std::vector<int> vl, std::vector<int> vr){
    N = vl.size();
    for (int i = 0; i < N; i++)
    {
        L[i] = vl[i];
        R[i] = vr[i];
    }

    for (int i = 0; i < MAXN; i++)
    {
        bbad[i] = hbad[i] = false;
        nc[i] = 0;
    }
    for (int i = 0; i < N; i++)
    {
        L[i] = vl[i];
        R[i] = vr[i];
    }

    llim = 1e9;
    flood (0, 0);

    int cloc = 0, cdep = 0;
    while (cloc >= 0)
    {
        if (!hbad[cloc] && cdep <= llim)
            return 1;
        cloc = L[cloc];
        cdep++;
    }

    if (llim < 1e6)
        return 0;

    for (int i = 0; i < N; i++)
        if (nc[i] >= 2 && !hbad[i])
            return 1;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...