解题思路: 我们可以使用深度优先搜索(DFS)来遍历所有路径,并计算路径代表的二进制数的值。然后判断该值是否在[l, r]区间范围内,如果是则计数加一。

具体步骤如下:

  1. 定义一个全局变量count,用于记录符合条件的路径数目。
  2. 定义一个递归函数dfs,用于进行深度优先搜索。
  3. dfs函数的参数包括当前节点的编号cur,当前路径的值path,以及当前路径的长度length。
  4. 在dfs函数内部,首先判断当前路径的值是否在[l, r]区间范围内,如果是则count加一。
  5. 然后判断当前节点是否有左孩子和右孩子,如果有则继续递归调用dfs函数,更新当前路径的值和长度。
  6. 最后,在主函数中调用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)

链接:httpsacnowcodercomacmcontest62033C来源:牛客网游游拿到了一棵树共有�n个节点每个节点都有一个权值:0或者1。这样每条路径就代表了一个二进制数。游游想知道有多少条路径代表的二进制数在��lr区间范围内?请注意:路径长度至少为1例如节点3到节点3虽然有一个权值但并不是合法路径!输入描述第一行输入三个正整数���nlr用空格隔开。第二行输入一个长度为00的01串第

原文地址: https://www.cveoy.top/t/topic/iooj 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录