# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1160519 | jus_teng | 9월 (APIO24_september) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<vector<ll>> buildTree(ll N, vector<ll>& P) {
vector<vector<ll>> adj(N);
for (ll i = 1; i < N; i++) {
adj[P[i]].push_back(i);
}
return adj;
}
void findLeaves(ll node, vector<vector<ll>>& adj, vector<ll>& leaves) {
if (adj[node].empty() && node != 0) {
leaves.push_back(node);
}
for (ll child : adj[node]) {
findLeaves(child, adj, leaves);
}
}
int solve(ll N, ll M, vector<ll> P, vector<vector<ll>> S) {
// Build adjacency list from parent array
vector<vector<ll>> adj = buildTree(N, P);
// Identify all leaf nodes
vector<ll> leaves;
findLeaves(0, adj, leaves);
sort(leaves.begin(), leaves.end());
// Handle edge cases
if (leaves.size() <= 1) return leaves.size();
ll maxDays = 0;
// Try all permutations of leaf falling order
do {
vector<queue<ll>> sequences(M);
for (ll i = 0; i < M; i++) {
for (ll leaf : S[i]) {
sequences[i].push(leaf);
}
}
ll days = 1;
bool valid = true;
// Simulate leaf falling
for (ll leaf : leaves) {
bool matched = false;
for (ll v = 0; v < M; v++) {
if (!sequences[v].empty() && sequences[v].front() == leaf) {
sequences[v].pop();
matched = true;
break;
}
}
if (!matched) {
days++; // New day if no volunteer expected this leaf
}
}
// Verify all sequences are exhausted
for (ll v = 0; v < M; v++) {
if (!sequences[v].empty()) {
valid = false;
break;
}
}
if (valid) {
maxDays = max(maxDays, days);
}
} while (next_permutation(leaves.begin(), leaves.end()));
return maxDays;
}