Submission #1066070

#TimeUsernameProblemLanguageResultExecution timeMemory
1066070ZicrusBeech Tree (IOI23_beechtree)C++17
58 / 100
2070 ms86600 KiB
#include <bits/stdc++.h>
#include "beechtree.h"
using namespace std;
 
typedef long long ll;

ll n;
vector<int> c;
vector<int> res;
vector<vector<ll>> adj;
vector<unordered_map<ll, ll>> adjSet;
vector<bool> mult;
unordered_map<ll, bool> cache;

bool subset(int a, int b) {
    ll hash = ((ll)a << 31) | (ll)b;
    if (cache.count(hash)) return cache[hash];
    for (auto &e : adjSet[a]) {
        int i = e.second;
        if (!adjSet[b].count(c[i])) return cache[hash] = false;
        if (!subset(i, adjSet[b][c[i]])) return cache[hash] = false;
    }
    return cache[hash] = true;
}

vector<pair<int, int>> dfsSol(int cur) {
    bool beautiful = !mult[cur];
    vector<pair<int, int>> arr;
    for (auto &e : adj[cur]) {
        auto tmp = dfsSol(e);
        arr.insert(arr.end(), tmp.begin(), tmp.end());
        beautiful &= res[e];
    }
    arr.push_back({arr.size()+1, cur});
    sort(arr.begin(), arr.end());
    if (!beautiful) return arr;
    
    for (int i = 1; i < arr.size(); i++) {
        if (!subset(arr[i-1].second, arr[i].second)) return arr;
    }
    res[cur] = 1;
    return arr;
}
 
vector<int> beechtree(int n1, int m, vector<int> p, vector<int> c1) {
    n = n1; c = c1;
    res = vector<int>(n);
    adj = vector<vector<ll>>(n);
    adjSet = vector<unordered_map<ll, ll>>(n);
    mult = vector<bool>(n);
    for (int i = 1; i < n; i++) {
        if (adjSet[p[i]].count(c[i])) mult[p[i]] = true;
        else adjSet[p[i]][c[i]] = i;

        adj[p[i]].push_back(i);
    }
    
    dfsSol(0);
    return res;
}

/*
For each subtree:
beautiful if:
- (All children are beautiful)
- All subtrees ordered by total size are subsets of each other
*/

#ifdef TEST
#include "grader.cpp"
#endif

Compilation message (stderr)

beechtree.cpp: In function 'std::vector<std::pair<int, int> > dfsSol(int)':
beechtree.cpp:38:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   38 |     for (int i = 1; i < arr.size(); i++) {
      |                     ~~^~~~~~~~~~~~
#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...