Submission #1233892

#TimeUsernameProblemLanguageResultExecution timeMemory
1233892HanksburgerBeech Tree (IOI23_beechtree)C++20
49 / 100
2096 ms29896 KiB
#include "beechtree.h"
#include <bits/stdc++.h>
using namespace std;
priority_queue<pair<pair<int, int>, int> > q;
vector<int> adj[200005], p, c, ans;
int sz[200005], n, m, t;
void calc(int u)
{
    sz[u]=1;
    for (int v:adj[u])
    {
        calc(v);
        sz[u]+=sz[v];
    }
}
int solve(int x)
{
    //cout << "solve " << x << '\n';
    vector<int> perm, mp(n, 0), freq(m+1, 0);
    q.push({{sz[x], t=0}, x});
    while (!q.empty())
    {
        int u=q.top().second;
        q.pop();
        mp[u]=perm.size();
        perm.push_back(u);
        //cout << "perm " << u << '\n';
        for (int v:adj[u])
            q.push({{sz[v], --t}, v});
    }
    for (int i=1; i<perm.size(); i++)
    {
        if (mp[p[perm[i]]]!=(freq[c[perm[i]]]++))
            return 0;
        //cout << "check ok " << i << '\n';
    }
    return 1;
}
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++)
        adj[p[i]].push_back(i);
    calc(0);
    for (int i=0; i<n; i++)
        ans.push_back(solve(i));
    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...