hdu 5416 CRB and Tree(dfs+前缀和)

题意:

在一棵树上有n个点,n-1条边,每条边都有一个权值。

令f(u,v)等于u到v这条路径上的前缀和。

现在给你Q次询问(Q<=10)

询问f(u,v)=s的路径有多少条。

解析:

由于Q比较小可以直接利用O(n)复杂度的算法来做。

先用sum[u]保存下,从根节点到u的异或和是多少。

用一个hash map来保存,sum[u]出现了多少次。

每次就查询hash map中s ^ sum[u]出现了多少次。

查询的总和除以2就是最终结果。

注意:

如果s=0时,f(u,u)也满足条件,所以还要再加上n。

my code

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn = (int)2e5 + 10;
struct Edge {
    int u, v, val;
    Edge() {}
    Edge(int u, int v, int val) : u(u), v(v), val(val) {}
};

int mp[maxn], sum[maxn];
vector<Edge> G[maxn];
int n, q;

void init() {
    memset(mp, 0, sizeof(mp));
    for(int i = 1; i <= n; i++) {
        G[i].clear();
    }
}

void addEdge(int u, int v, int val) {
    G[u].pb(Edge(u, v, val));
}

void dfs(int u, int pre, int val) {
    sum[u] = val;
    for(int i = 0; i < G[u].size(); i++) {
        int v = G[u][i].v;
        if(pre == v) continue;
        dfs(v, u, val^G[u][i].val);
    }
}

ll cal(int s) {
    ll ret = 0;
    for(int i = 1; i <= n; i++) {
        ret += mp[s^sum[i]];
    }
    if(s == 0) ret += n;
    return ret / 2;
}

int main() {
    int T;
    scanf("%d", &T);
    int u, v, val, s;
    while(T--) {
        scanf("%d", &n);
        init();
        for(int i = 1; i < n; i++) {
            scanf("%d%d%d", &u, &v, &val);
            addEdge(u, v, val);
            addEdge(v, u, val);
        }

        dfs(1, -1, 0);
        for(int i = 1; i <= n; i++) {
            mp[sum[i]]++;
        }

        scanf("%d", &q);
        while(q--) {
            scanf("%d", &s);
            printf("%lld\n", cal(s));
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 11:41:45

hdu 5416 CRB and Tree(dfs+前缀和)的相关文章

HDU 5416 CRB and Tree dfs

链接 题解链接:http://www.cygmasot.com/index.php/2015/08/20/hdu_5416/ 题意: 给定n个点的树 下面n-1行给出边和边权 下面q个询问 每个询问一个数字s 询问有多少条路径使得路径的边权异或结果 == s 结果%(1e9+7) 询问不超过10组. 思路: 设路径{u,v}的边权异或结果为 f(u,v) 设lca 为u v的最近公共祖先 首先得到一个结论,f(u,v) =f(lca, u) ^ f(lca, v) 因为f(lca, root)

Hdu 5416 CRB and Tree (bfs)

题目链接: Hdu 5416 CRB and Tree 题目描述: 给一棵树有n个节点,树上的每条边都有一个权值.f(u,v)代表从u到v路径上所有边权的异或值,问满足f(u,v)==m的(u, v)有多少中情况(u, v有可能相同)? 解题思路: 由于xor的特殊性质.x^x=0,对于求f(u, v) == f(u, 1) ^ f(1, u). 又因为x^y == z可以推出x^z == y,对于f(u, 1) ^ f(1, v) == m可以转化为m ^ f(1, v) == f(u, 1)

HDU 5416——CRB and Tree——————【DFS搜树】

CRB and Tree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 967    Accepted Submission(s): 308 Problem Description CRB has a tree, whose vertices are labeled by 1, 2, …, N. They are connected b

HDU 5416 CRB and Tree (技巧)

题意:给一棵n个节点的树(无向边),有q个询问,每个询问有一个值s,问有多少点对(u,v)的xor和为s? 注意:(u,v)和(v,u)只算一次.而且u=v也是合法的. 思路:任意点对之间的路径肯定经过LCA的,但是如果如果知道某个点t到根的路径xor和为e,那么就能够得知 x^e=s中的x应该是多少,那就算有多少点到根的xor和为x即可.e是表示t到根的,所以而x也是其他点到根的路径xor和,两个点他们的LCA到根这段会被算2次,那么xor就为0了. (1)DFS算出每个点到根的路径xor和,

HDU 5416 CRB and Tree

题目大意: T, T组测试数据 给你一个n有n个点,下标是从 1 开始的.这个是一棵树,然后下面是n-1条边, 每条边的信息是 s,e,w 代表 s-e的权值是w 然后是一个Q代表Q次询问. 每次询问是一个数字a,  代表 所有路径想异或后的值是 a的路径有多少条. (注:  自己到自己的异或值是0,若a是0要考虑自己到自己) 题目分析: 从根节点开始进行一遍DFS求出所有点到 跟节点的异或值.也就得出来了根节点到达其他任何一个点的异或值. 比如 a 是跟节点到A的异或值, b是根节点到B的异或

hdu 2489 Minimal Ratio Tree(dfs枚举 + 最小生成树)~~~

题目: 链接:点击打开链接 题意: 输入n个点,要求选m个点满足连接m个点的m-1条边权值和sum与点的权值和ans使得sum/ans最小,并输出所选的m个点,如果有多种情况就选第一个点最小的,如果第一个点也相同就选第二个点最小的........ 思路: 求一个图中的一颗子树,使得Sum(edge weight)/Sum(point weight)最小~ 数据量小,暴力枚举~~~~~dfs暴力枚举C(M,N)种情况. 枚举出这M个点之后,Sum(point weight)固定,进行prim或者K

HDU 2489 Minimal Ratio Tree (dfs+Prim最小生成树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2489 Problem Description For a tree, which nodes and edges are all weighted, the ratio of it is calculated according to the following equation. Given a complete graph of n nodes with all nodes and edges

hdu 2489 Minimal Ratio Tree DFS枚举点+最小生成树 属于中等偏上题 ,Double比较大小的时候注意精度问题

Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2835    Accepted Submission(s): 841 Problem Description For a tree, which nodes and edges are all weighted, the ratio of it is

HDU 2489 Minimal Ratio Tree (DFS枚举+最小生成树Prim)

Problem Description For a tree, which nodes and edges are all weighted, the ratio of it is calculated according to the following equation. Given a complete graph of n nodes with all nodes and edges weighted, your task is to find a tree, which is a su