Submission #1132845

#TimeUsernameProblemLanguageResultExecution timeMemory
1132845SpyrosAlivBeech Tree (IOI23_beechtree)C++20
5 / 100
50 ms16044 KiB
#include <bits/stdc++.h>
using namespace std;

int n, m;
vector<vector<int>> tree;
vector<int> c;

vector<int> solve_line() {
    vector<int> ans(n, false);
    ans[n-1] = true;
    for (int i = n-1; i >= 1; i--) {
        if (c[i] != c[n-1]) {
            break;
        }
        ans[i-1] = true;
    }
    return ans;
}

vector<int> beechtree(int N, int M, vector<int> P, vector<int> C) {
    n = N;
    m = M;
    c = C;
    tree.clear();
    tree.resize(n);
    bool line = true;
    for (int i = 1; i < n; i++) {
        tree[P[i]].push_back(i);
        if (P[i] != i-1) line = false;
    }
    if (line) return solve_line();
    vector<int> ans(n, 0);
    vector<int> dep(n, 0);
    for (int i = 1; i < n; i++) {
        if (P[i] == 0) dep[i] = 1;
        else {
            dep[i] = 2;
            ans[i] = 1;
        }
    }
    vector<int> cnt(m+1, 0);
    bool f = true;
    for (int i = 1; i < n; i++) {
        if (dep[i] != 1) continue;
        vector<int> colors;
        for (auto next: tree[i]) {
            if (next == 0) continue;
            colors.push_back(c[next]);
            cnt[c[next]]++;
        }
        sort(colors.begin(), colors.end());
        int sz = colors.size();
        bool curr = true;
        for (int j = 1; j < sz; j++) {
            if (colors[j] == colors[j-1]) {
                curr = false;
                break;
            }
        }
        if (curr) ans[i] = true;
        if (!curr) f = false;
    }
    if (!f) return ans;
    vector<bool> seen(m+1, false);
    for (int i = 0; i < n; i++) {
        if (P[i] == 0) {
            if (seen[c[i]]) return ans;
            seen[c[i]] = true;
        }
        //if (i != 0 && ans[i] == 0) return ans;
    }
    for (int i = 0; i <= m; i++) {
        if (!seen[i] && cnt[i]) return ans;
    }
    ans[0] = 1;
    return ans;
}
/*
int main() {
    vector<int> f = beechtree(5, 4, {-1, 0, 1, 2, 3, 4}, {0, 0, 1, 1, 1, 1});
    for (auto x: f) cout << x << " ";
    cout << '\n';
}*/
#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...