# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1193972 | zh_h | 9월 (APIO24_september) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#define pb push_back
#define lint long long int
using namespace std;
vector<int> mx, subtree_mx;
vector<vector<int>> edge;
void dfs(int v, int p) {
subtree_mx[v] = mx[v];
for (auto i : edge[v]) {
if (i == p) continue;
dfs(i, v);
subtree_mx[v] = max(subtree_mx[v], subtree_mx[i]);
}
}
int solve (int n, int m, vector<int> parent, vector<vector<int>> s) {
edge.resize(n);
for (int i = 1; i < n; i ++) {
edge[i].pb(parent[i]);
edge[parent[i]].pb(i);
}
mx.resize(n, -1);
for (int i = 0; i < m; i ++) {
for (int j = 0; j < n-1; j ++) {
mx[s[i][j]] = max(mx[s[i][j]], j);
}
}
subtree_mx.resize(n, 0);
dfs(0, -1);
int cur_mx = 0;
int cur_i = 0;
int ans = 0;
while (cur_i < n-1) {
ans ++;
cur_mx = cur_i;
while (cur_i <= cur_mx) {
cur_mx = max(cur_mx, subtree_mx[s[0][cur_i]]);
cur_i ++;
}
}
return ans;
}
int main() {
int n, m;
cin >> n >> m;
vector<int>p(n);
for (int i = 0; i < n; i ++) {
cin >> p[i];
}
vector<vector<int>> s;
for (int i = 0; i < m; i ++) {
vector<int> s_temp(n-1);
for (int j = 0; j < n-1; j ++) {
cin >> s_temp[j];
}
s.pb(s_temp);
}
cout << solve(n, m, p, s) << endl;
}