【树上异或和计数】czr 太弱啦

【题目】:

  给一棵树,求异或和为k的路径个数。

【题解】:

  很遗憾比赛时做不出来,后来看别人题解做出来的。用于记录博客所用。

  然后进行Dfs,得到从根节点到某一个节点的异或值,计算方案时只需要在map中查询w xor k的数量(如果路径不经过所选的根节点,那么其公共部分对答案无影响),不难发现这样计算不需要考虑k=0的特殊情况和重复的问题。

我们可以在O (nlogn)的时间完成这个过程。

  值得一提的是,题目保证了直径不超过150000,意在防止Dfs导致爆栈。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N = 1e6+10;
 4 typedef struct Edge{
 5     int to,next,w;
 6 }Edge;
 7 Edge e[N<<1];
 8 map<int,int>Mp;
 9 int head[N],cnt,n,m,k;
10 long long ans;
11 void add_edge(int u,int v,int w){
12     e[cnt] = Edge{ v ,head[u],w};
13     head[u] = cnt ++ ;
14 }
15 void dfs(int u,int fa,int w){
16     ans = ans + Mp[w^k];
17     Mp[w] ++ ;
18     for(int i=head[u];~i;i=e[i].next){
19         int to = e[i].to;
20         if( to == fa ) continue;
21         dfs( to , u , w^e[i].w );
22     }
23 }
24 int main()
25 {
26     memset(head,-1,sizeof head );
27     scanf("%d%d",&n,&k);
28     for(int i=1,u,v,w;i<n;i++){
29         scanf("%d%d%d",&u,&v,&w);
30         add_edge(u,v,w);
31         add_edge(v,u,w);
32     }
33     dfs(1,1,0);
34     printf("%lld\n",ans);
35     return 0;
36 }

树上异或和为k的方案数

原文地址:https://www.cnblogs.com/Osea/p/11272714.html

时间: 2024-10-29 02:52:11

【树上异或和计数】czr 太弱啦的相关文章

ACM--次数最多--HDOJ 1032--The 3n + 1 problem--水(数据太弱)

HDOJ题目地址:传送门 The 3n + 1 problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 34456    Accepted Submission(s): 12454 Problem Description Problems in Computer Science are often classified as b

你以为自己很强,其实是圈子太弱!

小白叨一叨:让比你弱,比你小,比你低的人点赞不叫本事,让比你强,比你长,比你高的人点赞才算英雄.在自己固有的范围杰出不算杰出,真正的杰出,往往是超越自己的固有范围和层次的.用郭德纲的话说就是:"不是自己多有本事,主要是同行的衬托." 某高富帅对我说他最近身边好多美女备胎,有些甚至是有夫之妇,平时总会约她出来吃吃喝喝甚至别的.他觉得他的魅力好大.我好奇问:"你是这些美女圈子里面最高富帅的一个?"他说:"认识啊,我当然不是."我又问:"那约

树上异或和最大

http://poj.org/problem?id=3764 题意:求上任意两点的边权异或最大值. 解法:dfs遍历树的同时将异或值加入01字典树中,同时查询最大异或值. 这样为什么就能保证你所求的结果对应的路径是连续的呢?考虑三种情况: 1.深搜的两条路径一个包含在另一个中,这样一异或,公共的部分的值变成 0 了,剩下的部分是连续的. 2.深搜的两条路径部分重叠,同理,异或后公共的部分变成 0 了,由于是对边权的异或,剩下的部分仍然连续. 3.深搜的两条路径不重叠,但是两条路径肯定有公共的点—

还是太弱~

刚才在千里码上看到一道题,题意大概是这样的,很简单,求第2333个可以被2或者3整除的数 窝开始想首先所有偶数都是,数据量比较大窝可以枚举被3整除的奇数,但是不是很好枚举,我认为数据量很小,也没有必要了, 然后我从2开始暴力枚举,很轻松的求出了答案,我看了其他人的报告,基本都是用我这样的方法暴力求得,最后看了出题人的答案 1  2  3  4  5  6 7  8  9  10 11  12 13  14 15 16 17 18 画出每6个数中符合要求的数,剩下的就不剧透了,还是没有养成分析问题

hdu 2821 学习一点dfs的小技巧吧。。 还是自己太弱了

#include<iostream> #include<cstdio> #include<cstring> using namespace std; int r,c,s,flag; int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; char mapp[25][25],road[1000],d[5] = {"DURL"}; bool check(int x,int y) { if(x < 0 || x &g

打算做一款给方便学生生活的APP,虽然已经有口袋小安了,但是那个功能太弱了。。。

目前已经反编译拿到了学校校园卡充值app的登陆密码加密算法,我已经可以将充值的功能提取了. 所以app第一个功能就是可以充值校园卡和查看消费记录... 还有就是选课,我pc端,,(哈哈不算pc端),python的抢课代码早在大一就完成了一半了.移植到app上不过是换成java而已. 发帖.这个功能怎么能少.. 还有就是消息的聚合.这个我上学期无聊写了一个 安青二手市场,学校教务处,图书馆的新闻推送的脚本 所以我打算把全部在线的消息整合,然后再添加到app上. 看课表,查成绩这种一定会有的功能,一

hdu 4901 The Romantic Hero(计数dp)2014多校训练第4场1005

The Romantic Hero                                                                               Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description There is an old country and the king fell in lov

差分 and 树上差分

差分数组 定义 百度百科中的差分定义 //其实这完全和要讲的没关系 qwq 进去看了之后是不是觉得看不懂? 那我简单概括一下qwq 差分数组de定义:记录当前位置的数与上一位置的数的差值. 栗子 容易发现的是,\(\sum_{1}^{i}{b_i}\)即代表\(a_i\) 的值. \((\sum_{1}^{i}\) 即代表从1累加到i.) 思想 看到前面的\(\sum_{1}^{i}\) 你一定会发现这是前缀和! 那你认为这是前缀和? 的确是qwq. 实际上这并不是真正意义上的前缀和. 前缀和的

差分数组 and 树上差分

差分数组 定义 百度百科中的差分定义 //其实这完全和要讲的没关系 qwq 进去看了之后是不是觉得看不懂? 那我简单概括一下qwq 差分数组de定义:记录当前位置的数与上一位置的数的差值. 栗子 容易发现的是,\(\sum_{j=1}^{i} b_j\)即代表\(a_i\) 的值. \((\sum\) 即代表累加.) 思想 看到前面的\(\sum\) 你一定会发现这是前缀和! 那你认为这是前缀和? 的确是qwq. 实际上这并不是真正意义上的前缀和. 前缀和的思想是 根据元素与元素之间的并集关系(