博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #396 (Div. 2) E. Mahmoud and a xor trip 树形压位DP
阅读量:4481 次
发布时间:2019-06-08

本文共 1340 字,大约阅读时间需要 4 分钟。

 

题目链接:

Examples

input

3

1 2 3

1 2

2 3

out

10

 

题意:

  给你一棵n个点的树,每个点有点权,求所有不同的路径异或和的总和

题解:

  DP

  任选一个root,设定dp[i][j][0]为以i为最高点的路径异或和中,二进制上第j为分别是0,1的数量

  记录答案

 

#include
using namespace std;#pragma comment(linker, "/STACK:102400000,102400000")#define ls i<<1#define rs ls | 1#define mid ((ll+rr)>>1)#define pii pair
#define MP make_pairtypedef long long LL;const long long INF = 1e17+1LL;const double Pi = acos(-1.0);const int N = 1e5+10, M = 1e3+20, mod = 1e9+7, inf = 2e9+10;int n,a[N];LL dp[N][40][2],ans;vector
G[N];void dfs(int u,int fa) { for(int i = 0; i < 30; ++i) dp[u][i][(a[u]>>i)&1] = 1; ans+=a[u]; for(int i = 0 ; i < G[u].size(); ++i) { int to = G[u][i]; if(to == fa) continue; dfs(to,u); for(int j = 0; j < 30; ++j) { ans += 1LL*(1<
>j)&1); dp[u][j][1] += dp[to][j][p^1], dp[u][j][0] += dp[to][j][p^0]; } }}int main() { scanf("%d",&n); for(int i = 1; i <= n; ++i) scanf("%d",&a[i]); for(int i = 1; i < n; ++i) { int x,y; scanf("%d%d",&x,&y); G[x].push_back(y); G[y].push_back(x); } dfs(1,-1); cout<
<
View Code

 

转载于:https://www.cnblogs.com/zxhl/p/6505278.html

你可能感兴趣的文章
新创建django项目,但网页打不开127.0.0.1:8000
查看>>
Python练习-内置函数的应用
查看>>
洛谷P3905 道路重建
查看>>
数据表格 - DataGrid - 行编辑
查看>>
HQL查询语句
查看>>
jsp听课笔记(四)
查看>>
vim
查看>>
数组的键/值操作函数
查看>>
Android单点触控与多点触控切换的问题解决方案
查看>>
JS常用函数与方法
查看>>
十、Shell基础
查看>>
py16 面向对象深入
查看>>
CentOS 7 安装 Gitlab
查看>>
JavaScript-03-常见函数
查看>>
ajax 设置Access-Control-Allow-Origin实现跨域访问
查看>>
去掉ExpandableListView的箭头图标
查看>>
[LeetCode]Binary Tree Level Order Traversal II
查看>>
跨页面传值自动刷新 操作文本与文件夹
查看>>
最完美的毁尸灭迹:皮箱连环弃尸案始末
查看>>
002
查看>>