Submission #1233891

#TimeUsernameProblemLanguageResultExecution timeMemory
1233891Ghulam_JunaidBeech Tree (IOI23_beechtree)C++20
0 / 100
2097 ms65152 KiB
#include <bits/stdc++.h>
#include "beechtree.h"
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];
set<int> st_lvl[N];

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

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

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){
    sort(g[v].begin(), g[v].end(), cmp);
    for (int u : g[v]){
        if (delay[u]) delayed.push_back(u);
        else label[u] = ++cur_label;
    }

    for (int u : g[v])
        if (label[u])
            rev[label[u]] = u, Label(u);
}

void solve(int v){
    for (int i = 0; i <= n; i ++)
        st_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);

    while (!delayed.empty()){
        label[delayed.back()] = ++cur_label;
        rev[label[delayed.back()]] = delayed.back();
        delayed.pop_back();
    }

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