链接:httpsacnowcodercomacmcontest62033C来源:牛客网游游拿到了一棵树共有�n个节点每个节点都有一个权值:0或者1。这样每条路径就代表了一个二进制数。游游想知道有多少条路径代表的二进制数在��lr区间范围内?请注意:路径长度至少为1例如节点3到节点3虽然有一个权值但并不是合法路径!输入描述第一行输入三个正整数���nlr用空格隔开。第二行输入一个长度为00的01串第
解题思路: 我们可以使用深度优先搜索(DFS)来遍历所有路径,并计算路径代表的二进制数的值。然后判断该值是否在[l, r]区间范围内,如果是则计数加一。
具体步骤如下:
- 定义一个全局变量count,用于记录符合条件的路径数目。
- 定义一个递归函数dfs,用于进行深度优先搜索。
- dfs函数的参数包括当前节点的编号cur,当前路径的值path,以及当前路径的长度length。
- 在dfs函数内部,首先判断当前路径的值是否在[l, r]区间范围内,如果是则count加一。
- 然后判断当前节点是否有左孩子和右孩子,如果有则继续递归调用dfs函数,更新当前路径的值和长度。
- 最后,在主函数中调用dfs函数,并输出count的值。
代码如下:
#include <iostream>
#include <vector>
using namespace std;
int count = 0;
void dfs(int cur, int path, int length, vector<int>& values, vector<vector<int>>& edges, int l, int r) {
path = (path << 1) + values[cur];
length++;
if (path >= l && path <= r) {
count++;
}
if (edges[cur].size() > 0) {
for (int i = 0; i < edges[cur].size(); i++) {
int next = edges[cur][i];
dfs(next, path, length, values, edges, l, r);
}
}
}
int main() {
int n, l, r;
cin >> n >> l >> r;
vector<int> values(n+1);
for (int i = 1; i <= n; i++) {
char c;
cin >> c;
values[i] = c - '0';
}
vector<vector<int>> edges(n+1);
for (int i = 1; i <= n-1; i++) {
int u, v;
cin >> u >> v;
edges[u].push_back(v);
}
dfs(1, 0, 0, values, edges, l, r);
cout << count << endl;
return 0;
}
时间复杂度分析: 假设树的节点数为n,那么DFS的时间复杂度为O(n),因为每个节点只会访问一次。而输入的时间复杂度为O(n),因为需要读入n个节点的权值和n-1条边的信息。因此,总的时间复杂度为O(n)。
空间复杂度分析: DFS的空间复杂度为O(h),其中h为树的高度。而在本题中,树的高度最大为n-1,所以空间复杂度为O(n)。此外,还需要额外的O(n)空间来存储节点的权值和边的信息。因此,总的空间复杂度为O(n)
原文地址: https://www.cveoy.top/t/topic/iooj 著作权归作者所有。请勿转载和采集!