分析
注意到数据范围不大
点的数量是, 边的数量也是
可以用解决
- 每个点作为根查找一下路径
- 发现满足条件累计答案
算法时间复杂度可以通过
代码实现
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 1e3 + 10;
int n;
LL l, r;
LL w[N];
vector<int> g[N];
int ans = 0;
void dfs(int u, int fa, LL cur, int cnt) {
if (cur > r) return;
if (cnt >= 1 && cur >= l && cur <= r) ans++;
for (int v : g[u]) {
if (v == fa) continue;
dfs(v, u, (cur << 1ll) + w[v], cnt + 1);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> l >> r;
string s;
cin >> s;
for (int i = 0; i < s.size(); ++i) w[i + 1] = s[i] - '0';
for (int i = 0; i < n - 1; ++i) {
int a, b;
cin >> a >> b;
g[a].push_back(b);
g[b].push_back(a);
}
for (int i = 1; i <= n; ++i) dfs(i, -1, w[i], 0);
cout << ans << '\n';
return 0;
}

京公网安备 11010502036488号