Submission #1370086

#TimeUsernameProblemLanguageResultExecution timeMemory
1370086Sam_a17September (APIO24_september)C++20
100 / 100
383 ms24344 KiB
#include "september.h"

#include <bits/stdc++.h>
using namespace std;

const int maxN = 1e5 + 10;
int tin[maxN], tout[maxN];
vector<int> adj[maxN];
int p[maxN];
bool deleted[maxN];
int timer;
set<pair<int, int>> st;

void dfs(int node, int parent)
{
    tin[node] = timer++;
    p[node] = parent;
    st.insert({tin[node], node});

    for (int i : adj[node])
    {
        if (i == parent)
            continue;
        dfs(i, node);
    }
    tout[node] = timer - 1;
}

int covered[6];

void del(int node)
{
    st.erase({tin[node], node});
    deleted[node] = true;
    for (int i = 0; i < 6; i++)
    {
        covered[i]++;
    }
}

int solve(int N, int M, std::vector<int> F, std::vector<std::vector<int>> S)
{
    timer = 0;
    for (int i = 0; i < 6; i++)
    {
        covered[i] = 0;
    }
    st.clear();
    for (int i = 0; i < N; i++)
    {
        adj[i].clear();
        deleted[i] = false;
    }

    for (int i = 0; i < N; ++i)
    {
        if (F[i] != -1)
        {
            adj[F[i]].push_back(i);
            adj[i].push_back(F[i]);
        }
    }

    dfs(0, -1);

    int ans = 0;
    for (int i = 0; i < S[0].size(); ++i)
    {
        int starting = 1;
        for (int j = 0; j < M; j++)
        {
            if (covered[j])
            {
                starting = 0;
            }
        }

        ans += starting;

        for (int j = 0; j < M; j++)
        {
            int node = S[j][i];
            if (deleted[node])
            {
                covered[j]--;
                continue;
            }

            while (true)
            {
                auto it = st.lower_bound({tin[node], -1});
                if (it == st.end() || it->first > tout[node])
                {
                    break;
                }
                del(it->second);
            }
            covered[j]--;
        }
    }

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