Submission #1242589

#TimeUsernameProblemLanguageResultExecution timeMemory
1242589bangan참나무 (IOI23_beechtree)C++20
0 / 100
2100 ms73032 KiB
#include "beechtree.h"
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define ALL(a) a.begin(), a.end()

vector<int> beechtree(int n, int m, vector<int> p, vector<int> c) {
    vector<vector<int>> adj(n);
    for (int i=1; i<n; i++) adj[p[i]].pb(i);

    vector<int> ans(n), h(n), sz(n);
    auto dfs = [&](auto self, int v) -> vector<int> {
        sz[v] = !adj[v].empty();
        vector<int> sub{v};
        for (auto u : adj[v]) {
            h[u] = h[v]+1;
            auto vec = self(self, u);
            sz[v] += sz[u];
            for (auto it : vec) sub.pb(it);
        }

        sort(ALL(sub));
        do {
            if (sub[0] != v) continue;
            
            bool valid = true;
            for (int i=1; i<sub.size(); i++) {
                int f=0;
                for (int j=1; j<i; j++) f += c[sub[i]]==c[sub[j]];
                if (sub[f] != p[sub[i]]) valid = false;
            }

            int r = sub.size();
            while (0 <= r-1 && adj[sub[r-1]].empty()) r--;
            for (int i=0; i+1 < r; i++) if (h[sub[i]] > h[sub[i+1]]) valid = false;
            for (int i=0; i<r; i++) if (adj[sub[i]].empty()) valid = false;
            for (int i=0; i+1 < r; i++) if (h[sub[i]] == h[sub[i+1]] && sz[sub[i]] < sz[sub[i+1]]) valid = false;
            for (int i=0; i+1 < r; i++) if (h[sub[i]]==h[sub[i+1]] && sz[sub[i]]==sz[sub[i+1]] && sub[i]>sub[i+1]) valid = false;

            if (valid) ans[v] = 1;

        } while (next_permutation(ALL(sub)));
        
        return sub;
    };
    dfs(dfs, 0);

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