| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1355520 | serendipitous | September (APIO24_september) | C++20 | 0 ms | 0 KiB |
#include <september.h>
#include <bits/stdc++.h>
using namespace std;
void fallDFS(vector<vector<int>> &tree, int u, vector<int> &maxChildFall) {
for(int v: tree[u]) {
fallDFS(tree, v, maxChildFall);
maxChildFall[u] = max(maxChildFall[u], maxChildFall[v]);
}
}
int solve(int N, int M, vector<int> F, vector<vector<int>> S) {
vector<vector<int>> tree(N);
for(int i = 1; i < N; ++i) {
// child i, parent F[i]
tree[F[i]].push_back(i);
}
vector<int> &S1 = S[0];
vector<int> fall(N);
for(int t = 0; t < N-1; ++t) {
fall[S1[t]] = t; // the leaf falls at time t
}
vector<int> maxChildFall(fall); // invalid for index 0
fallDFS(tree, 0, maxChildFall);
int days = 0;
// cerr << "S1: ";
// for(int x: S1) {
// cerr << x << ' ';
// }
// cerr << "\n fall: ";
// for(int x: fall) {
// cerr << x << ' ';
// }
// cerr << "\n maxChildFall: ";
// for(int x: maxChildFall) {
// cerr << x << ' ';
// }
// cerr << '\n';
for(int i = 0; i < N-1;) {
// greedily batching S1
++days;
int endIdx = i;
// cerr << "(";
while(i <= endIdx) {
// cerr << S1[i] << " ";
endIdx = max(endIdx, maxChildFall[S1[i]]);
++i;
}
// cerr << ")\n";
}
return days;
}
int __main() {
int N, M; cin >> N >> M;
vector<int> F(N);
for(int &parent: F) {
cin >> parent;
}
vector<vector<int>> S(M);
for(int i = 0; i < M; ++i) {
S[i] = vector<int>(N-1);
for(int &del: S[i]) {
cin >> del;
}
}
cout << solve(N, M, F, S);
}