思路:题目说了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()

京公网安备 11010502036488号