[JLOI2012] 树


Submit solution

Points: 100
Time limit: 1.0s
Memory limit: 80M

Author:
Problem type
Allowed languages
C, C++

[JLOI2012] 树

题目描述

给你一棵以 1 为根的有根树。每个结点 (i) 有一个权值 (a_i)。

我们想统计有多少条"向下的路径"(从某个结点出发,不断走到它的子孙,结点深度严格递增),使得路径上结点权值之和等于 (s)

路径可以从树上任意结点开始,并在它的任意后代结点结束;不要求必须从根出发,也不要求到叶子结束。 "深度升序"就是指沿着父→子→孙… 的方向走(不回头、不拐上去)。

输入格式

  • 第一行:两个整数 (n, s) —— 结点数与目标和。
  • 第二行:(n) 个整数,依次为 \(a_1, a_2, \dots, a_n\) —— 每个结点的权值。
  • 接下来 (n-1) 行:每行两个整数 (x, y),表示 (y) 是 (x) 的儿子(方向由父到子)。

输出格式

输出一个整数:权值和恰好为 (s) 的向下路径数

输入输出样例 #1

输入 #1
3 3
1 2 3
1 2
1 3
输出 #1
2
解释

满足条件的两条路径为:

  • \(1 \rightarrow 2\),和为 (1+2=3);
  • 结点 (3) 自己(长度为 1 的向下路径),和为 (3)。

数据范围与约定

  • \(1 \le n \le 10^5\)
  • \(1 \le a_i, s \le 10^3\)

注:输入的 (n-1) 条边保证形成一棵以 1 为根的树;深度定义为:根的深度为 0,根的儿子深度为 1,依此类推。


Comments

There are no comments at the moment.