Submission #1218387

#TimeUsernameProblemLanguageResultExecution timeMemory
1218387vaneaBeech Tree (IOI23_beechtree)C++20
0 / 100
110 ms104520 KiB
#include <bits/stdc++.h>
#include "beechtree.h"
using namespace std;
using ll = long long;

const int mxN = 2e5+10;

int c[mxN], dep[mxN], sz[mxN];
vector<int> adj[mxN];
bool pos[mxN];
array<int, 2> cont[mxN];

set<int> dfs(int node, int p) {
    set<int> colors, all_colors;
    int cont_cnt = 0, cont_mx = 0;
    sz[node] = 1;
    vector<set<int>> v;
    for(auto it : adj[node]) {
        if(it == p) continue;
        if(colors.count(c[it]) != 0) {
            pos[node] = false; break;
        }
        all_colors.insert(c[it]);
        colors.insert(c[it]);
        set<int> nxt_colors = dfs(it, node);
        sz[node] += sz[it];
        dep[node] = max(dep[node], dep[it]+1);
        if(!pos[it]) {
            pos[node] = false; break;
        }
        v.push_back(nxt_colors);
        if(cont[it][0] >= 2) {
            ++cont_cnt;
            cont_mx = max(cont_mx, cont[it][0]);
            if(cont[it][1] != c[it]) pos[node] = false;
        }
        if(nxt_colors.size() > all_colors.size()) swap(nxt_colors, all_colors);
        for(auto it : nxt_colors) {
            all_colors.insert(it);
        }
    }
    if(cont_cnt > 1) {
        pos[node] = false;
    }
    for(auto it : all_colors) {
        if(!colors.count(it)) {
            pos[node] = false; break;
        }
    }
    if(dep[node] > 2) pos[node] = false;
    if(cont_cnt == 1) {
        if(sz[node] == (cont_mx + adj[node].size())) return all_colors;
        pos[node] = false;
        return {};
    }
    if(!pos[node]) return {};
    for(auto it : adj[node]) {
        if(it == p) continue;
        if(cont[it][0] + 1 > cont[node][0]) {
            if(cont[it][1] == c[it]) {
                cont[node][0] = cont[it][0] + 1;
                cont[node][1] = c[it];
            }
        }
        if(cont[node][0] == 0) {
            cont[node][0] = 1;
            cont[node][1] = c[it];
        }
    }
    sort(v.begin(), v.end(), [&](set<int> a, set<int> b) {
        return a.size() > b.size();
    });
    for(int i = 1; i < v.size(); i++) {
        for(auto it : v[i]) {
            int it1 = v[i-1].count(it);
            if(it1 == 0) {
                pos[node] = false;
                break;
            }
        }
    }
    if(pos[node]) return all_colors;
    else return {};
}

vector<int> beechtree(int n, int m, vector<int> p, vector<int> C) {
    for(int i = 1; i < n; i++) {
        adj[i].push_back(p[i]);
        adj[p[i]].push_back(i);
        c[i] = C[i];
        pos[i] = true;
    }
    adj[0].push_back(-1);
    pos[0] = true;
    dfs(0, -1);
    vector<int> ans(n);
    for(int i = 0; i < n; i++) ans[i] = pos[i];
    return ans;
}


/*int main()
{
    vector<int> ans = beechtree(18, 3,
 {-1, 0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 10, 11, 11},
 {0, 1, 2, 3, 1, 2, 3, 1, 3, 3, 2, 1, 1, 2, 2, 1, 2, 3});
    for(auto it : ans) {
        cout << it << ' ';
    }
}*/


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