思路:题目说了n的范围较小,所以说可以用回溯来找到所有可能的路径并进行统计。首先我们可以做一个剪枝,如果当前的值已经>r了,就直接结束。然后还需要注意题目说了路径长度不能为1,因此要用一个depth变量来记录下长度

接下来就可以正常写回溯了,不过在统计答案的时候需要注意下,当前值处于l和r之间就可以进行答案统计,但是统计完了之后不要直接返回,因为有可能l和r的范围比较大,能够有多个满足条件的答案,这个和一般的回溯输出路径有所不同。

那写回溯就是三件套了:构建现场,递归,恢复现场。这里我用的是位运算来写的,这样会更快一些。然后再以每个节点作为开头,进行一次dfs,最终输出结果即可

代码:

import sys
input = lambda: sys.stdin.readline().strip()

import math
inf = 10 ** 18

def I():
    return input()

def II():
    return int(input())

def MII():
    return map(int, input().split())

def GMI():
    return map(lambda x: int(x) - 1, input().split())

def LI():
    return input().split()

def LII():
    return list(map(int, input().split()))

def LFI():
    return list(map(float, input().split()))

fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
isqrt = lambda x: int(math.sqrt(x))

'''

'''

def solve():
    n, l, r = LII()
    a = [0] + list(map(int, I()))
    g = [[] for _ in range(n + 1)]
    for _ in range(n - 1):
        u, v = MII()
        g[u].append(v)
        g[v].append(u)

    def dfs(u, fa):
        nonlocal tmp, ans, depth
        if tmp > r:
            return

        if l <= tmp <= r and depth > 1:
            ans += 1

        for v in g[u]:
            if v == fa:
                continue
            depth += 1
            tmp = tmp << 1 | a[v]
            dfs(v, u)
            tmp >>= 1
            depth -= 1

    ans = 0
    for i in range(1, n + 1):
        tmp = a[i]
        depth = 1
        dfs(i, -1)

    print(ans)

t = 1
# t = II()
for _ in range(t):
    solve()