Submission #1221133

#TimeUsernameProblemLanguageResultExecution timeMemory
1221133trimkusBeech Tree (IOI23_beechtree)C++20
66 / 100
2098 ms69508 KiB
/******************************************************************************

                              Online C++ Compiler.
               Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************
* 
*/
//#define DEBUG
#ifndef DEBUG
#include "beechtree.h"
#endif
#include <bits/stdc++.h>
using namespace std;
//#define DEBUG
std::vector<int> beechtree(int N, int M, std::vector<int> P, std::vector<int> C)
{
    set<int> level1;
    int col = -1;
    vector<int> res(N);
    vector<vector<int>> adj(N);
    for (int i = 1; i < N; ++i) {
        adj[P[i]].push_back(i);
    }
    vector<int> sz(N,1);
    auto dfs = [&](auto& dfs, int node) -> void {
        /// << node << " = ";
        bool ok = true;
        res[node] = 1;
        for (auto& u : adj[node]) {
            dfs(dfs, u);
            sz[node]+=sz[u];
        }
        for (auto& u : adj[node]) {
            if (!res[u]) {
                res[node] = 0;
                return;
            }
        }
        vector<int> ord;
        priority_queue<std::array<int, 3> >pq;
        pq.push({sz[node],-(int)ord.size(),node});
        while(pq.size()){
            int v =pq.top()[2];
            pq.pop();
            ord.push_back(v);
            for(int x : adj[v]){
                pq.push({sz[x],-(int)ord.size(),x});
            }
        }
        map<int, int> cnt;
        int need = 0;
        #ifdef DEBUG
        cout << "at node = " << node << ":\n";
        #endif
        for (auto i : ord) {
            #ifdef DEBUG
            cout << " node = " << i << ", with color = " << C[i] << ", need = " << need << "\n";
            #endif
            if(need++==0)continue;
            int p = ord[cnt[C[i]]++];
            if(p!=P[i]){
                res[node]=0;
                break;
            }
        }
    };
    dfs(dfs, 0);
    return res;
}
#ifdef DEBUG
int main(){
    int n,m;
    cin>>n>>m;
    vector<int>p(n),c(n);
    for(int&x:p)cin>>x;
    for(int&x:c)cin>>x;
    for(auto x:beechtree(n,m,p,c)){
        cout << x << " ";
    }
}
#endif
#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...