#include <bits/stdc++.h>
using namespace std;
using ll = long long;
vector<ll> results;
ll dfs(ll v, ll parent, vector<set<ll>>& adj, vector<vector<ll>>& volunteers) {
if(results[v] != -1) return results[v];
ll lastFall = -1;
for (ll i = 0; i < volunteers.size(); i++) {
lastFall = max(lastFall, volunteers[i][v]);
}
for(ll e : adj[v]) {
if(e != parent) {
lastFall = max(lastFall, dfs(e, v, adj, volunteers));
}
}
return results[v] = lastFall;
}
int solve(int N, int M, std::vector<int> F, std::vector<std::vector<int>> S) {
results.resize(N, -1);
vector<set<ll>> initialTree(N);
for (int i = 1; i < F.size(); i++) {
initialTree[F[i]].insert(i);
}
vector<vector<ll>> volunteers(M, vector<ll>(N));
for (int i = 0; i < S.size(); ++i) {
for (int j = 0; j < S[i].size(); ++j) {
volunteers[i][S[i][j]] = j;
}
}
dfs(0, -1, initialTree, volunteers);
ll maxAns = 0;
for(vector<int> record : S) {
vector<ll> ordered(N - 1);
for (int i = 0; i < record.size(); ++i) {
ordered[i] = results[record[i]];
}
ll ans = 0, curFall = -1;
for (int i = 0; i < ordered.size(); ++i) {
if(curFall < ordered[i]) {
++ans;
curFall = ordered[i];
}
}
maxAns = max(maxAns, ans);
}
results.clear();
return maxAns;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |