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和,相同的用一个桶装起来,复杂度O(n)。
(2)对于每个询问s,穷举树上n个点,找到另一个点到root的路径xor和,在对应桶里的都是可以组成s的。(注意要去重)
特别要注意的是,s可能为0,那么就有x^x=s的情况,另一个点也会在同一个桶里。还有,要用long long保存答案。
#include <bits/stdc++.h>
#define pii pair<int,int>
#define INF 0x7f7f7f7f
#define LL long long
using namespace std;
const int N=;
vector<int> vect[N];
struct node
{
int from,to,val;
node(){};
node(int from,int to,int val):from(from),to(to),val(val){};
}edge[N*];
int edge_cnt, n, buck[N*], self[N], vis[N], q; void add_node(int from,int to,int val)
{
edge[edge_cnt]=node(from, to, val);
vect[from].push_back(edge_cnt++);
} void DFS(int x,int sum)
{
vis[x]=;
for(int i=; i<vect[x].size(); i++)
{
node &e=edge[vect[x][i]];
if( !vis[e.to])
{
buck[ self[e.to]=sum^e.val ]++;
DFS(e.to, sum^e.val);
}
}
} LL get_ans(int a)
{
LL ans=;
if(a==)
{
for(int j=; j<=n; j++)
{
int t=self[j]; //a为0,这个桶肯定是自己的那个
ans+=buck[ t ]-; //先扣掉自己。但是仍然会算重了。它到别人,别人也会到他。
}
ans+=n*; //每个点到自己都算。
}
else //a!=0,那么不可能有两个相同数的异或和为a的。
{
for(int j=; j<=n; j++)
{
int t=a^self[j]; //这个肯定不跟j同个桶。
ans+=buck[t];
}
}
return ans/; //去重
} void cal(int n)
{
memset(vis, , sizeof(vis));
memset(buck, , sizeof(buck));
memset(self, , sizeof(self));
DFS(, );
cin>>q;
for(int i=,a=; i<q; i++)
{
scanf("%d", &a);
printf("%lld\n", get_ans(a));
}
} int main()
{
freopen("input.txt", "r", stdin);
int t, a, b, c;
cin>>t;
while(t--)
{
cin>>n;
edge_cnt=;
for(int i=; i<=n; i++) vect[i].clear();
for(int i=; i<n; i++)
{
scanf("%d%d%d", &a, &b, &c);
add_node(a,b,c);
add_node(b,a,c);
}
add_node(, , ); //虚拟的根节点,0号节点
cal(n);
}
return ;
}
AC代码
数据
2
3
1 2 1
2 3 2
3
2
3
4
4
1 2 1
2 3 2
2 4 1
4
0
1
2
3
答案:
1
1
0
5
2
1
2
HDU 5416 CRB and Tree (技巧)的更多相关文章
- Hdu 5416 CRB and Tree (bfs)
题目链接: Hdu 5416 CRB and Tree 题目描述: 给一棵树有n个节点,树上的每条边都有一个权值.f(u,v)代表从u到v路径上所有边权的异或值,问满足f(u,v)==m的(u, v) ...
- HDU 5416 CRB and Tree(前缀思想+DFS)
CRB and Tree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tot ...
- HDU 5416——CRB and Tree——————【DFS搜树】
CRB and Tree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)
CRB and Tree Time Limit: 8000/4000 MS (J ...
- HDU 5416 CRB and Tree (2015多校第10场)
欢迎參加--每周六晚的BestCoder(有米!) CRB and Tree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536 ...
- HDU 5416 CRB and Tree
题目大意: T, T组测试数据 给你一个n有n个点,下标是从 1 开始的.这个是一棵树,然后下面是n-1条边, 每条边的信息是 s,e,w 代表 s-e的权值是w 然后是一个Q代表Q次询问. 每次询问 ...
- HDOJ 5416 CRB and Tree DFS
CRB and Tree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tot ...
- HDU 5416 CBR and tree
#include<bits/stdc++.h> using namespace std; #define for(i,a,b) for(int i=a;i<=b;++i) //T,N ...
- 异或+构造 HDOJ 5416 CRB and Tree
题目传送门 题意:给一棵树,问f (u, v) 意思是u到v的所有路径的边权值的异或和,问f (u, v) == s 的u,v有几对 异或+构造:首先计算f (1, u) 的值,那么f (u, v) ...
随机推荐
- codeforces 690D1 D1. The Wall (easy)(dfs)
题目链接: D1. The Wall (easy) time limit per test 0.5 seconds memory limit per test 256 megabytes input ...
- relative和absolute
relative 相对定位 1. 幻影瞬移 absolute属性也有瞬移技能,不同之处在于:absolute属性以天空或其他外界限制计算瞬移位置:而relative属性由于是凡人肉体,偏移能力有限,只 ...
- 笔记本电脑处理器(CPU)性能排行榜
笔记本电脑处理器(CPU)性能排行榜 本排行榜随新款处理器(CPU)的发布而随时更新.更新日期:2012年7月15日 排名 型号 二级+三级缓存 前端总线(MHz) 功率(瓦) 主频(MHz) 核 ...
- 数据库sql互转(oracle转mysql为例子)
转自: https://blog.csdn.net/sinat_32366329/article/details/76402059 在PowerDesinger里找到 File -->> ...
- View Controller Programming Guide for iOS---(六)---Responding to Display-Related Notifications
Responding to Display-Related Notifications 响应跟显示相关的通知 When the visibility of a view controller’s vi ...
- logging日志类
#! /usr/bin/env python #coding=utf-8 import logging,os class Logger: def __init__(self, path,clevel ...
- js、匿名函数、闭包、回调函数
234567891011121314151617181920212223242526272829303132333435 闭包 闭包:闭包是指有权访问另一个函数作用域中的变量的函数 函数嵌套一个函数, ...
- 51nod 1051 最大子矩阵和(DP)
题意 略 分析 一道经典的DP题,但是我弱到差点做不出来,真的垃圾 设置\(sum(i,j)代表1-i行第j列的前缀和\),然后枚举行i和行j,再枚举列k,做一遍类似一维的最大子段和即可 #inclu ...
- Jmeter之添加响应断言,bean shell post processor
一直在想运用jmeter来实现接口自动化测试,但是每次每个接口执行完,需要肉眼去看一看,执行的结果对不对,总结了两种办法, 一.将每个请求的响应结果,导出到文件 选中请求右键-->添加后置处理器 ...
- AtCoder Grand Contest 018 D - Tree and Hamilton Path
题目传送门:https://agc018.contest.atcoder.jp/tasks/agc018_d 题目大意: 给定一棵\(N\)个点的带权树,求最长哈密顿路径(不重不漏经过每个点一次,两点 ...