| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1366663 | djsksbrbf | September (APIO24_september) | C++20 | 0 ms | 0 KiB |
#include <cassert>
#include <cstdio>
#include <vector>
#include <bits/stdc++.h>
#include <vector>
using namespace std;
bool vis[20004];
int cnt[20005];
set <int> s;
vector <int> adj[20005];
void dfs(int cur, int par){
s.insert(cur);
for(auto it : adj[cur]){
if(it == par)continue;
dfs(it, cur);
}
}
typedef pair <int, int> pii;
int solve(int N, int M, std::vector<int> F, std::vector<std::vector<int>> S) {
for(int i = 1 ; i < N ; i++)adj[F[i]].push_back(i);
int ans = 0, day = 0;
while(day < N - 1){
do{
for(int i = 0 ; i < M ; i++){
cnt[S[i][day]]++;
dfs(S[i][day], S[i][day]);
if(cnt[S[i][day]] == M)s.erase(S[i][day]);
}
day++;
}while(s.size());
ans++;
}
s.clear();
for(int i = 0 ; i < N ; i++){
adj[i].clear();
vis[i] = 0;
cnt[i] = 0;
}
return ans;
}
void taskcase() {
int N, M;
assert(2 == scanf("%d%d", &N, &M));
std::vector<int> F(N);
F[0] = -1;
for (int i = 1; i < N; ++i)
assert(1 == scanf("%d", &F[i]));
std::vector<std::vector<int>> S(M, std::vector<int>(N - 1));
for (int i = 0; i < M; ++i)
for (int j = 0; j < N - 1; ++j)
assert(1 == scanf("%d", &S[i][j]));
printf("%d\n", solve(N, M, F, S));
}
int main() {
int T;
assert(1 == scanf("%d", &T));
while(T--) taskcase();
return 0;
}