题目
第一行是一个整数
N
(
1
≤
N
≤
1
0
5
)
N(1\leq N \leq10^5)
N(1≤N≤105),表示配置文件数量。
第二行包含
N
−
1
N-1
N−1个整数
p
i
p_i
pi,第
i
(
1
≤
i
<
N
)
i(1\leq i < N)
i(1≤i<N)个数表示文件i继承了文件
p
i
(
1
≤
p
i
<
i
)
p_i(1\leq p_i < i)
pi(1≤pi<i)的配置,其中文件0是根配置文件。
第二行是一个整数
Q
(
1
≤
Q
<
1
0
5
)
Q(1\leq Q < 10^5)
Q(1≤Q<105),表示小茗同学修改文件的次数(以为文件数量众多,小茗同学可能犯糊涂二多次修改同一个文件)。
接下来Q行,每行保护一个整数
x
(
1
≤
x
<
N
)
x(1\leq x < N)
x(1≤x<N),表示小茗同学修改了文件x以及继承自该文件的配置文件不再依赖根配置文件;输出每次修改后依赖根配置文件的文件数。
示例
输入
7
0 1 1 3 3 2
6
3
4
5
2
1
3
输出
4
4
4
2
1
1
题解
#include<iostream>
#include<vector>
//使用dfs,v[]里面存储各个文件直接对应的子文件
using namespace std;
int n, q, x, total;
vector<int> v[10005];
bool book[10005];
void dfs(int index){
if(!book[index]) {
book[index] = true;
total -= 1;
}
if(v[index].size() == 0) return;
for(int i = 0; i < v[index].size(); i++){
dfs(v[index][i]);
}
}
int main(){
cin >> n;
total = n;
for(int i = 1; i < n; i++){
scanf("%d", &x);
v[x].push_back(i);
}
cin >> q;
for(int i = 0; i < q; i++){
scanf("%d", &x);
dfs(x);
printf("%d\n", total);
}
return 0;
}