제출 #1234574

#제출 시각아이디문제언어결과실행 시간메모리
1234574ericl23302참나무 (IOI23_beechtree)C++20
8 / 100
105 ms84144 KiB
#include "beechtree.h"
#include <bits/stdc++.h>

using namespace std;

/*
// sub 3 doesn't work because it doesn't consider colour of direct children of node 0
// unordered_map<int, int> dfs(vector<vector<int>> &children, vector<int> &P, vector<int> &C, vector<int> &res, int cur) {
//     unordered_map<int, int> curM;
//     for (auto &i : children[cur]) {
//         auto um = dfs(children, P, C, res, i);
//         um[C[i]] = 1;
//         for (auto &[colour, cnt] : um) {
//             if (curM[colour]) return curM;
//         }
//     }
//     res[cur] = 1;
//     return curM;
// }

// std::vector<int> beechtree(int N, int M, std::vector<int> P, std::vector<int> C)
// {
//     vector<vector<int>> children(N);
//     for (int i = 1; i < N; ++i) children[P[i]].push_back(i);
//     vector<int> res(N, 0);

//     vector<unordered_map<int, int>> maps;
//     bool ok = true;
//     for (auto &child : children[0]) {
//         if (ok) maps.push_back(dfs(children, P, C, res, child));
//         else dfs(children, P, C, res, child);
//         if (res[child] == 0) ok = false;
//     }

//     if (ok) {
//         sort(maps.begin(), maps.end(), [](const unordered_map<int, int> &a, const unordered_map<int, int> &b) {
//             return a.size() < b.size();
//         });
//         int sz = maps.size();
//         for (int i = 1; i < sz; ++i) {
//             for (auto &[colour, cnt] : maps[i]) {
//                 if (!maps[i - 1][colour]) {
//                     ok = false;
//                     break;
//                 }
//             }
//             if (!ok) break;
//         }
//     }

//     if (ok) res[0] = 1;

//     return res;
// }
*/

unordered_map<int, int> FAIL;

unordered_map<int, int> dfs(vector<vector<int>> &children, vector<int> &P, vector<int> &C, vector<int> &res, int cur) {
    unordered_map<int, int> curM, childM;
    int depth = 0;
    bool fail = false;
    for (auto &i : children[cur]) {
        auto um = dfs(children, P, C, res, i);
        if (um[-1]) fail = true;
        um.erase(-1);
        if (curM[C[i]]) fail = true;
        if (!fail) {
            ++curM[C[i]];
            if (!childM.empty() && !um.empty()) fail = true;
            else if (!um.empty()) childM = um;
        }
    }

    if (fail) return FAIL;
    if (!childM.empty()) depth = 2;
    else if (!curM.empty()) depth = 1;
    if (depth <= 1) {
        res[cur] = 1;
        return curM;
    }

    for (auto &[colour, cnt] : childM) {
        if (!curM[colour]) return FAIL;
    }

    res[cur] = 1;
    
    return FAIL;
}

std::vector<int> beechtree(int N, int M, std::vector<int> P, std::vector<int> C)
{
    vector<vector<int>> children(N);
    for (int i = 1; i < N; ++i) children[P[i]].push_back(i);
    vector<int> res(N, 0);

    FAIL[-1] = 1;
    dfs(children, P, C, res, 0);

    return res;
}

#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...