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) ...
随机推荐
- hadoop-3.0.0-alpha4启动
全部启动或者全部停止(注意:第一次启动需要先格式,以后就不需要格式了,不能多次格式化) 1.启动 [root@master sbin]# pwd /usr/hadoop/hadoop-3.0.0-al ...
- 高并发服务器架构--SEDA架构分析
纯粹转发,没有深入研究,转自:SEDA架构笔记 百牛信息技术bainiu.ltd整理发布于博客园 一.传统并发模型的缺点 基于线程的并发 特点:每任务一线程直线式的编程使用资源昂高,context切 ...
- VS2010中编写x64汇编的具体方法
编写涉及系统特性的一些底层程序,特别是ShellCode,不可避免地要采用直接编写汇编代码的方式. 在目标平台为x86模式时,可以直接使用内联汇编,这个很多人都比较熟悉了,也非常地方便. 但是当目标平 ...
- 洛谷 - P1004 - 方格取数 - 简单dp
https://www.luogu.org/problemnew/show/P1004 这道题分类到简单dp但是感觉一点都不简单……这种做两次的dp真的不是很懂怎么写.假如是贪心做两次,感觉又不能证明 ...
- BZOJ3834:Solar Panels (分块)
题意 询问两个区间[smin,smax],[wmin,smax]中是否存在k的倍数,使得k最大 分析 将其转化成\([\frac{smin-1}k,\frac{smax}k],[\frac{wmin- ...
- 51nod 1272【二分+RMQ】
思路: 这题不能说是长见识,倒是第一次写这么富有套路的题,倒着来,二分区间嘛,这个很简单啊,二分的条件查询一个当前区间的最小值是不是比那个特定的值小,一步步缩小,这就是二分嘛,然后查询用线段树的RMQ ...
- BestCoder Round #74 (div.1) 1002Shortest Path(hdoj5636)
哈哈哈哈,我就知道这道题目再扔给我,我还是不会,就是这么菜,哈哈哈 一开始官方题解就没搞懂-然后就看了一下别人的代码,水水过就算了.今天拿到-GG: 题意: 一开始,有一张原图,有一条长度为n的链. ...
- bzoj 2806: [Ctsc2012]Cheat【广义SAM+二分+dp+单调队列】
把模板串建一个广义SAM 然后在线查询,每次在SAM上预处理出一个a[i]表示i位置向前最多能匹配多长的模板串 二分答案L,dp判断,设f[i]为·~i有几个匹配,转移显然是f[i]=max{f[i- ...
- Electron开发
[Debug] 1)cmd进入项目所在根目录,输入: $ npm install --save-dev devtron$ npm install --save electron-debug 2)在主j ...
- IT兄弟连 JavaWeb教程 使用Java同步机制对多线程同步
对于前面AdderServlet案例,它的sum实例变量用来累计客户端请求进行加法运算的和.sum变量的初始为100,如果第一个客户请求加上100,那么sum变量变为200,接着第二个客户请求加上20 ...