제출 #1233981

#제출 시각아이디문제언어결과실행 시간메모리
1233981Ghulam_Junaid참나무 (IOI23_beechtree)C++20
0 / 100
2097 ms68320 KiB
#include <bits/stdc++.h>
#include "beechtree.h"
// #include "grader.cpp"
using namespace std;

const int N = 2e5 + 10;
int n, m, h[N], sz[N], label[N], delay[N], rev[N], cur_label;
vector<int> par, col, ans, g[N];
map<int, int> cnt_lvl[N];

void dfs(int v){
    bool last_level = 1;
    int cnt_ch = 0;
    for (int u : g[v]){
        h[u] = h[v] + 1;
        dfs(u);
        cnt_lvl[h[v]][col[u]]++;
        last_level &= g[u].empty();
        cnt_ch += (col[u] == col[v]);
    }

    sz[v] = g[v].size();
    for (int u : g[v])
        if (g[u].empty() and cnt_lvl[h[u]].find(col[u]) == cnt_lvl[h[u]].end() and !last_level)
            delay[u] = 1;
}

vector<int> delayed;

bool cmp(int u, int v){
    return (sz[u] > sz[v] or (sz[u] == sz[v] and u < v));
}

void Label(int v){
    for (int u = 0; u < n; u ++)
        sort(g[u].begin(), g[u].end(), cmp);
    
    queue<int> q;
    q.push(v);

    while (!q.empty()){
        int v = q.front();
        q.pop();
        if (delay[v]){
            delayed.push_back(v);
            continue;
        }
        label[v] = cur_label++;
        rev[label[v]] = v;

        for (int u : g[v])
            q.push(u);
    }
}

void solve(int v){
    for (int i = 0; i <= n; i ++)
        cnt_lvl[i].clear(), h[i] = sz[i] = delay[i] = label[i] = rev[i] = 0;
    h[v] = 0;
    dfs(v);

    delayed.clear();
    label[v] = cur_label = 0;
    rev[label[v]] = v;
    Label(v);

    for (int x : delayed){
        label[x] = cur_label++;
        rev[label[x]] = x;
    }
    delayed.clear();

    map<int, int> cnt;
    ans[v] = 1;
    for (int i = 1; i < cur_label; i ++){
        int u = rev[i];
        ans[v] &= (par[u] == rev[cnt[col[u]]]);
        cnt[col[u]]++;
    }
}

vector<int> beechtree(int N, int M, vector<int> P, vector<int> C){
    n = N, m = M, par = P, col = C;
    ans.resize(n);

    for (int i = 1; i < n; i ++)
        g[par[i]].push_back(i);

    for (int i = 0; i < n; i ++)
        solve(i);

    return ans;
}
#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...