Submission #1247129

#TimeUsernameProblemLanguageResultExecution timeMemory
1247129linusvdvBeech Tree (IOI23_beechtree)C++20
9 / 100
2112 ms445760 KiB
#include "beechtree.h"
#include <algorithm>
#include <array>
#include <vector>

std::vector<int> sol;


std::vector<std::vector<std::pair<int, int>>> children;
std::vector<int> parent;
std::vector<int> color;

std::vector<int> DFS(int c) {
    std::vector<int> nodes = {c};
    for (auto [next, color] : children[c]) {
        std::vector<int> next_nodes = DFS(next);
        for (auto a : next_nodes) nodes.push_back(a);
    }
    std::sort(nodes.begin(), nodes.end());

    do {
        if (nodes[0] != c) continue;
        std::array<int, 502> colors; colors.fill(0);

        bool good = true;
        for (int i = 1; i < nodes.size(); i++) {
            if (nodes[colors[color[nodes[i]]]] != parent[nodes[i]]) {
                good = false;
                break;
            }
            colors[color[nodes[i]]]++;
        }

        if (good) {
            sol[c] = 1;
            break;
        }
    } while(std::next_permutation(nodes.begin(), nodes.end()));

    return nodes;
}


std::vector<int> beechtree(int N, int M, std::vector<int> P, std::vector<int> C)
{
    sol.assign(N, 0);
    parent = P;
    color = C;
    children.assign(N, {});
    for (int i = 1; i < N; i++) children[P[i]].push_back({i, C[i]});
    DFS(0);
    return sol;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...