E. Mahmoud and a xor trip

链接:

http://codeforces.com/contest/766/problem/E

题意:

给定一颗n节点的树以及每个节点的权值,另dis(u,v)表示节点u到v路径上的异或和,求不大于i的节点与i组成的有序对的距离的和(1<=i<=n)。

题解:

位运算的话大多可以想到按位拆分,统计每一位对答案的贡献,因为每一位的运算都是独立的。所以按位枚举,假设当前是第b位,则dp[x][0]表示以x为根节点的异或值为0的路径的数量,dp[x][1]也是如此定义。

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 #include <algorithm>
 5
 6 using namespace std;
 7 typedef long long LL;
 8 const int N = 1e5 + 10;
 9 LL dp[N][2], a[N];
10 LL ans = 0;
11 vector<int> G[N];
12
13 void dfs(int x, int fa, int bit)
14 {
15     LL q = 0;
16     int b = (a[x] >> bit) & 1;//取得当前的a[x]在第bit位是0还是1,
17     dp[x][b] = 1;//初始化
18     dp[x][b ^ 1] = 0;//初始化
19     for (int i = 0; i<G[x].size(); i++){
20         int v = G[x][i];
21         if (v == fa)continue;
22         dfs(v, x, bit);
23         q += dp[x][0] * dp[v][1] + dp[x][1] * dp[v][0];//统计子节点到x的路径上异或和,只需算1^0与0^1即可。
24         dp[x][b ^ 0] += dp[v][0];//更新异或操作后的状态值。
25         dp[x][b ^ 1] += dp[v][1];//更新异或操作后的状态值。
26     }
27     ans += (q << bit);//更新答案。
28 }
29 int main()
30 {
31     int n, u, v;
32     cin >> n;
33     for (int i = 1; i <= n; i++){
34         cin >> a[i];
35         ans += a[i];
36     }
37     for (int i = 0; i<n - 1; i++){
38         cin >> u >> v;
39         G[u].push_back(v);
40         G[v].push_back(u);
41     }
42     for (int i = 0; i <= 20; i++)//由于权值最大为1e6,所以其实枚举到20位就足够了。
43         dfs(1, 0, i);
44     cout << ans << endl;
45     return 0;
46 }

转载于:https://www.cnblogs.com/baocong/p/6394398.html

Codeforces Round #396 (Div. 2) E. Mahmoud and a xor trip 二进制拆位+树型dp相关推荐

  1. Codeforces Round #396(Div. 2)

    Codeforces Round #396 A. Mahmoud and Longest Uncommon Subsequence 题意 给定两串,求最长非公共子串. 非公共子串:A串的某子串sub_ ...

  2. Codeforces round 396(Div. 2) 题解

    Problem A 题目大意 给定两个字符串,要求构造出一个最长的一个串满足:这个串是其中一个串的字序列并且不是另一个串的子序列.输出长度.\((len \leq 10^5)\) 题解 千万年死在读题 ...

  3. Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) E. DNA Evolution 树状数组

    链接: http://codeforces.com/contest/828/problem/E 题解: 给你一个字符串s  q次操作 op==1 改变s[pos]位置的字符  op==2 将字符串e复 ...

  4. Codeforces Round #826 (Div. 3)(D. Masha and a Beautiful Tree)线段树解法

    题目大意:输入包含 t ( 1 ≤ t ≤ 1e4 ) 组测试样例,每组样例先输入 m 大小的数组,构建一棵满二叉树.问是否可以通过交换根节点的子树让序列变成升序. 思路 我们在树的每个节点记录下区间 ...

  5. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  6. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  7. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

  8. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

  9. Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...

最新文章

  1. .net中窗体之间的数据交换总结
  2. php要掌握的内容,入门PHPer需要掌握的哪些内容?
  3. c++ 多线程 垃圾回收器_7种jvm垃圾回收器,这次全部搞懂
  4. word List44
  5. Verilog状态机的编写学习
  6. docker build run 卡住_还在使用第三方Docker插件?SpringBoot官方插件真香!
  7. 【Vue2.0】—生命周期函数(十)
  8. 语音信号预处理4——绘制接滤波后chirp信号的时域图和频域图
  9. 小米 app消息推送服务器,APP使用小米消息推送自定义铃声iOS版
  10. Java使用融云SDK,推送聊天信息
  11. 常见路由器初始密码合集
  12. Toshiba e-STUDIO5616AC 一体机驱动
  13. lisp 阿基米德螺旋_用Auto CAD怎样画椭圆螺旋
  14. 网站被封申诉通道方式方法
  15. SolidWorks参数化设计中Excel的应用
  16. 离散数学题目——派谁出国学习
  17. WuThreat身份安全云-TVD每日漏洞情报-2023-02-27
  18. 一个很赞的ecshop微信商城系统!
  19. 2021-2022学年广州市第二中学九年级第一学期12月考英语试题
  20. 《拖延症心理学》读感

热门文章

  1. 更效率、更优雅 | 阿里巴巴开发者工具不完全盘点
  2. 《极乐迪斯科》:一趟充满新奇的旅程 ,一款里程碑式的 CRPG
  3. 数据复盘《糖豆人》爆火营销过程:怎么做到以小博大?
  4. 腾讯游戏4名技术专家详解:《御龙在天移动版》服务器性能优化
  5. 安装 Oracle Database PSU 10.2.0.4.2 步骤
  6. angularjs的一点总结
  7. AWK如何打印从某一列到最后一列的内容
  8. Eclipse Neon安装指导
  9. ecshop 快速添加会员
  10. Windows Form -----内容(2)