Submission #1211314

#TimeUsernameProblemLanguageResultExecution timeMemory
1211314omsincoconutBeech Tree (IOI23_beechtree)C++17
9 / 100
2097 ms66312 KiB
#include "beechtree.h"
#include <bits/stdc++.h>

using namespace std;

vector<int> beechtree(int N, int M, vector<int> P, vector<int> C) {
    vector<int> ret(N);

    vector<vector<int>> child(N);
    for (int i = 1; i < N; i++) child[P[i]].push_back(i);

    for (int i = 0; i < N; i++) {
        if (child[i].empty()) {
            ret[i] = true;
            continue;
        }

        map<int, vector<int>> P_C;

        stack<int> dt;
        dt.push(i);
        while (!dt.empty()) {
            int u = dt.top();
            dt.pop();
            
            if (u != i) P_C[P[u]].push_back(C[u]);
            for (int v : child[u]) dt.push(v);
        }

        bool can = true;
        vector<tuple<int, int, vector<int>>> sz_PC;
        for (auto [p, c] : P_C) {
            sort(c.begin(), c.end());
            for (int j = 0; j < (int)c.size()-1; j++) {
                if (c[j] == c[j+1]) can = false;
            }
            sz_PC.emplace_back(c.size(), p, c);
        }

        if (!can) {
            ret[i] = can;
            continue;
        }

        sort(sz_PC.begin(), sz_PC.end());
        reverse(sz_PC.begin(), sz_PC.end());
        
        int tmp_idx = 0;
        while (get<1>(sz_PC[tmp_idx]) != i) tmp_idx++;
        swap(sz_PC[0], sz_PC[tmp_idx]);

        map<int, int> cnt;
        int cur = 0;
        vector<int> seq;
        for (auto [sz, p, c] : sz_PC) {
            for (int j : c) {
                if (cnt[j] < cur) can = false;
                cnt[j]++;
            }
            cur++;
            seq.push_back(p);
        }

        map<int, int> cnt2;
        for (int u : seq) {
            if (u == i) continue;
            can &= (seq[cnt2[C[u]]] == P[u]);
            cnt2[C[u]]++;
        }

        ret[i] = can;
    }

    return ret;
}
#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...