Submission #1218428

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

const int mxN = 2e5+10;
const int INF = 1e9+10;

int sz[mxN];
bool pos[mxN];
set<array<int, 2>> srt[mxN];
map<int, vector<int>> col[mxN];

bool check(int v, int u) {
    for(auto [c, vec] : col[v]) {
        auto it = col[u].find(c);
        if(it == col[u].end() || sz[vec[0]] > sz[it->second[0]]) return false;
    }
    return true;
}

bool add(set<array<int, 2>> &srt, array<int, 2> p) {
    auto [it, st] = srt.insert(p);
    bool result = true;
    if(it != srt.begin()) {
        result &= check((*prev(it))[1], (*it)[1]);
    }
    if(next(it) != srt.end()) {
        result &= check((*it)[1], (*next(it))[1]);
    }
    return result;
}

int dfs(int node) {
    sz[node] = 1;
    pos[node] = true;
    for(auto [c, v] : col[node]) {
        pos[node] &= (v.size() == 1);
        for(auto it : v) {
            int nxt = dfs(it);
            if(nxt == -1) pos[node] = false;
            else {
                sz[node] += nxt;
            }
            if(pos[node]) {
                if(srt[it].size() > srt[node].size()) swap(srt[it], srt[node]);
                for(auto it1 : srt[it]) {
                    pos[node] &= add(srt[node], it1);
                }
            }
        }
    }
    pos[node] &= add(srt[node], {sz[node], node});
    return pos[node] ? sz[node] : -1;
}

vector<int> beechtree(int n, int m, vector<int> P, vector<int> C) {
    for(int i = 1; i < n; i++) {
        int p = P[i], c = C[i];
        if(!col[p].count(c)) {
            col[p][c] = vector<int>();
        }
        col[p][c].push_back(i);
    }
    dfs(0);
    vector<int> ans(n);
    for(int i = 0; i < n; i++) {
        ans[i] = pos[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...