Problem:
MathJax.Hub.Config({ tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]} });

C: ツイート数

問題

AORイカちゃんが利用するSNSであるイカったーでは、投稿のことをツイートと呼ぶ。

そして、イカったーでは、ツイートへの返信が多くなると視認性が悪くなることが懸念されるため、あるツイートが次の規則のいずれかを満たすときに画面にそのツイートを表示する仕様になっている。

規則１. どのツイートへも返信していない

規則２. どのツイートからも返信されていない

規則３. 規則２が適用されたツイートから返信先を順に辿ったとき、 $K$ 回未満で辿り着ける

なお、同じツイートは重複して表示されることはない。

いま、 $N$ 個のツイートがあり、 $A_i$ が $0$ のとき $i$ 番目のツイートは返信でないツイートで、 $A_i$ が $0$ でないとき $i$ 番目のツイートは $A_i$ 番目のツイートへの返信のツイートである。

画面に表示されるツイート数を答えよ。

制約

$1 \le N \le 10^5$

$1 \le K \le 10^5$

$0 \le A_i \lt i (i = 1, 2, \dots, N)$

ツイートは時系列順に与えられる。

入力は全て整数で与えられる。

入力形式

入力は以下の形式で与えられる。

$N \ K$
$A_1$
$A_2$
$\vdots$
$A_N$

出力

画面に表示されるツイート数を出力せよ。また、末尾に改行も出力せよ。

サンプル

サンプル入力 1

6 3
0
0
2
3
4
5

サンプル出力 1

5

この時、表示されるツイートは、図の青いツイートである。 よって、この例の解は $5$ である。

サンプル入力 2

12 2
0
1
0
3
4
3
6
7
0
9
10
11

サンプル出力 2

10

サンプル入力 3

5 10
0
0
0
0
0

サンプル出力 3

5

Solution in JAVA (judge verdict: Accepted)

import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		int n = s.nextInt();
		int k = s.nextInt();
		boolean [] not_replay = new boolean[n];
		boolean [] is_replayed = new boolean[n];
		boolean [] visible = new boolean[n];
		int [] parent = new int[n];
		int [] height = new int[n];
		for (int i=0;i<n;i++) {
			int a = s.nextInt();
			if (a == 0) {
				not_replay[i] = true;
				parent[i] = -1;
			} else {
				is_replayed[a - 1] = true;
				parent[i] = a - 1;
			}
		}
		Deque<Integer> que = new ArrayDeque<Integer>();
		boolean[] checked = new boolean[n];
		for (int i=0;i<n;i++) {
			check(i, not_replay, is_replayed, visible, que, height, checked);
		}
		while (!que.isEmpty()) {
			int x = que.poll();
			if (height[x] < k) {
				visible[x] = true;
				int p = parent[x];
				if (p != -1 && !checked[p]) {
					height[p] = height[x] + 1;
					checked[p] = true;
					que.add(p);
				}
			}
		}
		int ans = 0;
		for (int i=0;i<n;i++) {
			if (visible[i]) ans++;
		}
		System.out.println(ans);
	}
	static void check (int x, boolean[] not_replay, boolean[] is_replayed, boolean[] visible, Deque<Integer> que, int[] height, boolean[] checked) {
		if (not_replay[x]) {
			visible[x] = true;
		}
		if (!is_replayed[x]) {
			height[x] = 0;
			checked[x] = true;
			que.push(x);
		}
	}
}