Another Tree
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 46(17 users) Total Accepted: 17(15 users) Rating:  Special Judge: No
Description

给出一棵有N个节点(2 <= N <= 500000)和N-1条边的树,每条边拥有一个长度L(1 <= L <= 500000)。

定义:

(1)   path(u, v) = 顶点u和v之间的最短路。

(2)   xor-distance(u, v) = ⊕e∈path(u,v)length(e), ⊕代表异或操作。

请计算出有多少对点的xor-distance的值等于K(0 <= K <= 500000)。(v != u 并且 pair(u,v) = pair(v,u))。

Input

第一行是一个整数T,表示有T组测试数据。

接下来T组测试数据,每组测试数据开始为两个正整数N,K,接下来N-1行每行包含三个整数u,v,L(0 <= u,v <= N-1),代表树中存在一条顶点为u,v,边长为L的边。

Output

每组一行,输出点对的个数。

Sample Input

2

4 1

0 1 1

1 2 3

2 3 2

3 0

0 1 7

0 2 7

Sample Output

2

1

Source
2016级新生程序设计全国邀请赛

思路:

①思考我们求树上两点间距离的方式是:Dist(root,x)+Dist(root,y)-2*Dist(root,Lca(x,y));

②从而递推出当前问题亦或的距离:Dist(root,x)^Dist(root,y)^Dist(root,Lca(x,y))^Dist(root,Lca(x,y));从而化简为:Dist(root,x)^Dist(root,y)

③那么问题就是在寻找点对,使得其亦或和为K,那么我们随便定义一个点为根即可,去Dfs一遍树,记录vis【i】表示从根到点路径上的亦或和为i的点的个数。

那么对于统计答案的时候枚举一下即可。

Ac代码:

#include<stdio.h>
#include<string.h>
using namespace std;
struct node
{int from,to,w,next;
}e[1000050];
int cont;
int head[1050000];
int vis[1050000];
void add(int from,int to,int w)
{e[cont].to=to;e[cont].w=w;e[cont].next=head[from];head[from]=cont++;
}
void Dfs(int u,int from,int val)
{if(from!=-1)vis[val]++;for(int i=head[u];i!=-1;i=e[i].next){int v=e[i].to;int w=e[i].w;if(v==from)continue;Dfs(v,u,val^w);}
}
int main()
{int t;scanf("%d",&t);while(t--){cont=0;memset(vis,0,sizeof(vis));memset(head,-1,sizeof(head));int n,k;scanf("%d%d",&n,&k);for(int i=1;i<=n-1;i++){int x,y,w;scanf("%d%d%d",&x,&y,&w);x++,y++;add(x,y,w);add(y,x,w);}Dfs(1,-1,0);if(k==0){long long int output=0;for(int i=0;i<=1000000;i++){output+=(long long int )vis[i]*(vis[i]-1)/2;}printf("%lld\n",output);}else{long long int output=0;for(int i=0;i<=1000000;i++){output+=vis[i]*vis[i^k];}printf("%lld\n",output);}}
}

Hrbust 2302 Another Tree【思维+Dfs】相关推荐

  1. CF-825 G.Tree Queries(DFS)

    CF-825 G.Tree Queries(DFS) 题目链接 题意 一棵树nnn个节点(初始为白色),两种操作: 1 xxx 把节点xxx设置为黑色 2 xxx 求节点xxx到任意一个黑色节点的简单 ...

  2. C. Infected Tree(思维/dfs/树形dp)

    题目 题意: 给定一颗树 ,根节点为2,每个结点的子节点数不超过2(也就是说这是一个二叉树).现在根节点被感染了,我们需要拯救这棵树. 有n次过程,每次过程如下: 我们可以选择砍掉一个非感染点,使得该 ...

  3. New Year Tree(dfs序+线段树+二进制)

    题意: 给出一棵 n个节点的树,根节点为 1.每个节点上有一种颜色 ci.m次操作.操作有两种: 1 u c:将以 u为根的子树上的所有节点的颜色改为c. 2 u:询问以 u为根的子树上的所有节点的颜 ...

  4. Codeforces Round #316 (Div. 2) D. Tree Requests dfs序

    题目链接: 题目 D. Tree Requests time limit per test:2 seconds memory limit per test:256 megabytes 问题描述 Rom ...

  5. 【POJ - 3321】 Apple Tree(dfs序 + 线段树维护 或 dfs序 + 树状数组维护)

    题干: There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the t ...

  6. LeetCode 1516. Move Sub-Tree of N-Ary Tree(DFS)

    文章目录 1. 题目 2. 解题 1. 题目 Given the root of an N-ary tree of unique values, and two nodes of the tree p ...

  7. Codeforces 343D Water Tree(DFS序 + 线段树)

    题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...

  8. Split The Tree(dfs序+树状数组)

    Split The Tree 时间限制: 1 Sec  内存限制: 128 MB 提交: 46  解决: 11 [提交] [状态] [讨论版] [命题人:admin] 题目描述 You are giv ...

  9. Gym - 101972B Arabella Collegiate Programming Contest (2018) B. Updating the Tree 树DFS

    题面 题意:T组数据,每次给你1e5个点的树(1为根),每个点有一权值,询问1-n每个节点的子树中, 至少修改几个点的权值(每次都可以任意修改),才能让子树中任意2点的距离==他们权值差的绝对值 无解 ...

最新文章

  1. Flask之异常处理
  2. R语言使用forestplot包绘制森林图:编码创建森林图仿真数据、汇总线修改、元素位置调整、垂直线、字体、风格、置信区间、线型、图例、刻度、标签等
  3. QT textedit 滚动条自动往下滚动
  4. SQL group by 和 order by 、where、having
  5. mysql5.7.25源码安装_源码编译安装 mysql5.7.25
  6. Linux网络编程(一):Linux内核
  7. Java-GUI编程实战之管理系统 Day2【Swing(组件介绍、布局管理器、事件类及监听器类)、基础组件按钮和输入框的用法】
  8. .net 日期总结,用于业务时间查询
  9. 面试必问:如何实现Redis分布式锁
  10. 使用CultureInfo来显示中文星期
  11. TextMesh Pro不能显示中文的解决办法是创建字贴图,常用汉字3500+特殊字符
  12. 突出的就是一个「性价比」— 小新 Air 14 2020 评测
  13. HTML+CSS+JavaScript实现旅游网站官网
  14. 织梦DedeCMS从入门到精通建站视频教程全集
  15. 深入分析Zookeeper的Leader选举原理
  16. python包NetworkX学习——最短路径dijkstra_path和dijkstra_path_length
  17. 正版-WPS下载地址(免费)
  18. postman的使用
  19. 多元线性回归-Lasso
  20. CodeBlocks+wxWidgets

热门文章

  1. zynqmp zcu102 SD卡驱动调试
  2. 中学计算机课使用登记册,中学信息技术听课记录.doc
  3. 14天阅读挑战赛(学习建议)
  4. poj 3348 凸包
  5. java开发计划怎么写_【精编范文】从事java,下一工作阶段的工作计划以及业绩目标,怎么写-精选word文档 (16页)...
  6. 立志成事【管理学之八】
  7. Atheros-CSI-Tool(Ubuntu版本安装及使用过程)[原教程来自xieyaxiong]
  8. 2大学英语四级关于计算机的图表作文,大学英语四级考试图表作文及范文.doc
  9. 【Java】基于JSON-Schema生成随机JSON的解决方案
  10. 听说你要去面试程序员?这三个问题要先想清楚!