C - Mahmoud and a xor trip

CodeForces - 766E

补题的时候碰见的一道题目,感觉思路非常巧妙就记录下来了。

题目大意:给出n个点,每个点有一个点权,求所有路径的异或和,其中起点必须小于终点。

解题思路:我第一反应感觉有点像树分治,但是我不会,如果我们把每一个点权拆成二进制位,把答案分开计算也能得到最终答案。

如果我们每个点的值只有0或者1的话,让我们求异或和位1的路径数目,我们肯定会算。

以dp[i][0]表示以i为端点异或和0的数目,dp[i][1]表示以i为端点异或和为1的数目。

如何转移。

如果当前点的值为1,那么dp[u][1]=dp[u][1]+dp[v][0] dp[u][0]=dp[u][0]+dp[v][1];

同理当前点为0.。。。

其中v为u的一个子节点。

那么现在当前点不为1,是有多个0,1,组合而成,就进行logai次就可以了。。。

太妙了。。。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define sca(x) scanf("%d",&x)
#define pb(x) push_back(x)
#define N 100005vector<int>V[N];
int dp[N][2];
LL ans;
int a[N];void dfs(int u,int z,int fa)
{int pos=(a[u]&(1<<z))>>z;dp[u][0]=dp[u][1]=0;dp[u][pos]=1;for(int i=0; i<V[u].size(); i++){int v=V[u][i];if(v==fa)continue;dfs(v,z,u);ans+=(dp[u][0]*dp[v][1]+dp[u][1]*dp[v][0])*(1LL<<z);if(pos){dp[u][1]+=dp[v][0];dp[u][0]+=dp[v][1];}else{dp[u][1]+=dp[v][1];dp[u][0]+=dp[v][0];}}
}int main()
{int n;sca(n);for(int i=1; i<=n; i++)sca(a[i]),ans+=a[i];for(int i=1; i<n; i++){int x,y;sca(x),sca(y);V[x].pb(y);V[y].pb(x);}for(int i=0;i<21;i++)dfs(1,i,-1);cout<<ans<<endl;
}
/*
4
1 2 3 4
1 2
2 3
2 4
*/

CodeForces - 766E  (树形dp+二进制)相关推荐

  1. codeforces 337D:树形dp[能到最远的一定可以到其他点]

    题目链接 题意:有一颗有n个结点的树,树上存在一个污染源(位置不确定),它可以污染与它距离不超过d的节点,现给出m个被污染的节点(污染源本身也可能是被污染的节点),求污染源可能的位置数. 解题思路:很 ...

  2. CodeForces 543D 树形DP Road Improvement

    题意: 有一颗树,每条边是好边或者是坏边,对于一个节点为x,如果任意一个点到x的路径上的坏边不超过1条,那么这样的方案是合法的,求所有合法的方案数. 对于n个所有可能的x,输出n个答案. 分析: 题解 ...

  3. Codeforces 766E Mahmoud and a xor trip(树形DP)

    题目链接 Mahmoud and a xor trip 树形DP.先考虑每个点到他本身的距离和,再算所有点两两距离和. 做的时候考虑二进制拆位即可. #include <bits/stdc++. ...

  4. Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp

    链接: http://codeforces.com/contest/462/problem/D 题意: 给定n个点的树, 0为根,下面n-1行表示每个点的父节点 最后一行n个数 表示每个点的颜色,0为 ...

  5. codeforces 816 E. Karen and Supermarket(树形dp)

    题目链接:http://codeforces.com/contest/816/problem/E 题意:有n件商品,每件有价格ci,优惠券di,对于i>=2,使用di的条件为:xi的优惠券需要被 ...

  6. 【Codeforces Round #614(div2)】E-Xenon's Attack on the Gangs(树形dp)

    一.题目链接 https://codeforces.com/contest/1293/problem/E 二.题意 给n个结点,n-1条无向边.即一棵树.我们需要给这n-1条边赋上0~n-2不重复的值 ...

  7. 【Christmas Game】【CodeCraft-21 and Codeforces Round #711 (Div. 2)】【Nim-博弈】【树形DP】【拆分树】

    CodeCraft-21 and Codeforces Round #711 (Div. 2) Christmas Game Nim-博弈 树形DP 拆分树 牛客链接 https://ac.nowco ...

  8. Codeforces 1088E Ehab and a component choosing problem(树形DP)

    Codeforces 1088E Ehab and a component choosing problem(树形DP) 题意 给一棵树,要求从中选一些联通分量,使得平均联通分量重量总和最大.如果有多 ...

  9. Codeforces 671D. Roads in Yusland(树形DP+线段树)

    调了半天居然还能是线段树写错了,药丸 这题大概是类似一个树形DP的东西.设$dp[i]$为修完i这棵子树的最小代价,假设当前点为$x$,但是转移的时候我们不知道子节点到底有没有一条越过$x$的路.如果 ...

最新文章

  1. R计算赤信息指标(Akaike information criterion,AIC)
  2. linux进制转换的函数,Linux shell 进制转换
  3. 递归删除文件夹下面所有子文件夹中的.pyc后缀文件
  4. token拦截器android_vue.js添加拦截器,实现token认证(使用axios)
  5. windows分屏_windows内到底藏了多少好东西?
  6. 一文了解 CVPR 2022 Workshop 都要做什么
  7. java反向链表列表写法,一个使用链表追加,反向和显示的java程序
  8. 蚂蚁集团回应与腾讯微信支付竞争;华为余承东:鸿蒙现达到安卓70-80%水平;C++20 标准草案获批准| 极客头条
  9. 虚拟机安装windows xp系统时,找不到网络连接
  10. 北京2018年通信工程师考试报名通知
  11. linux编写自动运行一串命令的脚本
  12. Java支付宝APP支付-验证异步通知消息
  13. oracle 升级 32升级64 utlirp,Oracle 10G 32位升级64位
  14. 我的世界服务器不显示前缀,[管理|聊天]TRCStudioChatSystem —— 多功能聊天系统|聊天|脏话|匿名|前缀[1.7-1.15]...
  15. 几篇神经网络训练语言模型文章的阅读
  16. 高德地图在H5页面中的使用(VUE)
  17. ASP无限分类数据库版
  18. 程序猿,你的安全感呢?
  19. 洛谷P1331 海战 题解
  20. WijmoJS 支持模板字符串常量

热门文章

  1. Rockchip RK3588 kernel dts解析之PCIe
  2. 工行融e联,绿色通道便捷办理
  3. 拒绝黄牛 《东方早报》记者在太平洋数码遭殴
  4. java请输入三个成绩 求平均分_Java编程,定义一个学生类,输入3个学生数据,输出平均分和总分...
  5. Rx第四部分--并发
  6. CIO40: IT男之--佛系躺平
  7. SQL+HIVE 题目:查询下周过生日的学生
  8. 如何安装husky_GitHook 工具 —— husky介绍及使用
  9. [Unity实战]一个简单的unity手写摇杆[入门级][手写demo][开箱可用]
  10. 高德导航显示白屏的问题