제출 #1241452

#제출 시각아이디문제언어결과실행 시간메모리
1241452matsakyannn참나무 (IOI23_beechtree)C++20
22 / 100
146 ms107664 KiB
#include <bits/stdc++.h>
using namespace std;

#ifndef ONLINE_JUDGE
#define dbg(x) cerr << #x << ' '; print(x); cerr << endl;
#else
#define dbg(x)
#endif 

void print(int x) {cerr << x;}
void print(long long x) {cerr << x;}
void print(char x) {cerr << x;}
void print(string x) {cerr << x;}
void print(double x) {cerr << x;}
template <class T> void print(vector <T> x);
template <class T> void print(set <T> x);
template <class T> void print(multiset <T> x);
template <class T, class V> void print(pair <T, V> x);
template <class T, class V> void print(map <T, V> x);
template <class T> void print(vector <T> x) {cerr << "[ "; for(auto i : x) {print(i); cerr << ' ';} cerr << "]";}
template <class T> void print(set <T> x) {cerr << "[ "; for(auto i : x) {print(i); cerr << ' ';} cerr << "]";}
template <class T> void print(multiset <T> x) {cerr << "[ "; for(auto i : x) {print(i); cerr << ' ';} cerr << "]";}
template <class T, class V> void print(pair <T, V> x) {cerr << "{"; print(x.first); cerr << ' '; print(x.second); cerr << "}";}
template <class T, class V> void print(map <T, V> x) {cerr << "[ "; for(auto i : x) {print(i); cerr << ' ';} cerr << "]";}

#define ll long long
#define pb push_back
#define ppb pop_back
#define PII pair <int, int>
#define PLL pair <ll, ll>
#define all(v) (v).begin(), (v).end()
#define OK cerr << "OK\n";
#define MP make_pair

const int N0 = 2e5 + 5;
int n, m;
vector <int> p, c, T[N0], answ;

vector <int> dfs(int node){
    if(T[node].empty()){
        return {};
    }

    //build ultimate set
    set <int> ultimate;
    for(int u : T[node]){
        ultimate.insert(c[u]);
    }
    if(ultimate.size() != T[node].size()) answ[node] = 0;

    //build sub
    vector <pair <int, set <int>>> sub;
    for(int u : T[node]){
        vector <int> k = dfs(u);
        answ[node] &= answ[u];
        set <int> colors;
        for(int i : k){
            colors.insert(c[i]);
        }
        sub.pb({colors.size(), colors});
    }

    //check
    sort(all(sub));
    reverse(all(sub));
    set <int> tmp = ultimate;
    for(auto x : sub){
        int sz = tmp.size();
        set <int> ntmp;
        for(int i : x.second){
            tmp.insert(i);
            ntmp.insert(i);
        }
        if(tmp.size() != sz){
            answ[node] = 0;
        }
        tmp = ntmp;
    }
    
    vector <int> res;
    return T[node];
}

vector <int> beechtree(int N, int M, vector <int> P, vector <int> C){
    n = N, m = M, p = P, c = C;
    for(int i = 1; i < n; i++){
        T[p[i]].pb(i);
    }
    answ.assign(n, 1);
    dfs(0);
    return answ;
}
#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...