Codeforces Round #396 (Div. 2) E. Mahmoud and a xor trip 二进制拆位+树型dp
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相关推荐
- Codeforces Round #396(Div. 2)
Codeforces Round #396 A. Mahmoud and Longest Uncommon Subsequence 题意 给定两串,求最长非公共子串. 非公共子串:A串的某子串sub_ ...
- Codeforces round 396(Div. 2) 题解
Problem A 题目大意 给定两个字符串,要求构造出一个最长的一个串满足:这个串是其中一个串的字序列并且不是另一个串的子序列.输出长度.\((len \leq 10^5)\) 题解 千万年死在读题 ...
- 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复 ...
- Codeforces Round #826 (Div. 3)(D. Masha and a Beautiful Tree)线段树解法
题目大意:输入包含 t ( 1 ≤ t ≤ 1e4 ) 组测试样例,每组样例先输入 m 大小的数组,构建一棵满二叉树.问是否可以通过交换根节点的子树让序列变成升序. 思路 我们在树的每个节点记录下区间 ...
- Codeforces Round #506 (Div. 3)
Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...
- 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 ...
- 构造 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 的例子可以 ...
- Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...
- Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...
最新文章
- .net中窗体之间的数据交换总结
- php要掌握的内容,入门PHPer需要掌握的哪些内容?
- c++ 多线程 垃圾回收器_7种jvm垃圾回收器,这次全部搞懂
- word List44
- Verilog状态机的编写学习
- docker build run 卡住_还在使用第三方Docker插件?SpringBoot官方插件真香!
- 【Vue2.0】—生命周期函数(十)
- 语音信号预处理4——绘制接滤波后chirp信号的时域图和频域图
- 小米 app消息推送服务器,APP使用小米消息推送自定义铃声iOS版
- Java使用融云SDK,推送聊天信息
- 常见路由器初始密码合集
- Toshiba e-STUDIO5616AC 一体机驱动
- lisp 阿基米德螺旋_用Auto CAD怎样画椭圆螺旋
- 网站被封申诉通道方式方法
- SolidWorks参数化设计中Excel的应用
- 离散数学题目——派谁出国学习
- WuThreat身份安全云-TVD每日漏洞情报-2023-02-27
- 一个很赞的ecshop微信商城系统!
- 2021-2022学年广州市第二中学九年级第一学期12月考英语试题
- 《拖延症心理学》读感