题意:给一棵树(1e5),每个节点上有对应权值(0<=ai<=1e6)定义树上两个节点间的距离为路径中节点的异或,求所有节点对间的距离和(包括节点自身也作为节点对,距离为节点权值)。

解题思路:

  做了771C后这道题就有感觉了。关键在于将每个权值的二进制位拆开计算,以dp[u][i][0]和dp[u][i][1]记录到达节点u的子树上的节点的距离的第 i 位为0和1的个数有多少,维护计算就可以了。比较僵的是开始写的时候没有考虑单独一个节点作为一个节点对,所以在每个递归的最后面单独加上到全局变量res中。

  每一个递归的最开始,用局部变量num数组记录u的权值的二进制形式,同时初始化dp[u]数组。对每个子节点的遍历转移:

  先递归子节点,返回后则已计算完毕。则有如果u的第 i 位为1,dp[u][i][1]+=dp[v][i][0], dp[u][i][0]+=dp[v][i][1]; 否则dp[u][i][1]+=dp[v][i][1], dp[u][i][0]+=dp[v][i][0]; 这里应该不难理解。

  至于统计答案,只计算为1的即可,即int cnt1=dp[u][i][1]*dp[v][i][0]+dp[u][i][0]*dp[v][i][1]; res+=1LL*cnt1*(1<<i);

  见代码:(转移其实比771C好写一点感觉)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
#define sqr(x) ((x)*(x))
const int N=1e5+,M=;
int head[N],nxt[N<<],to[N<<],cnt;
int n,a[N],dp[N][M][];
ll res;
void init(){
memset(head,-,sizeof(head));
res=cnt=;
}
void addEdge(int u,int v){
nxt[cnt]=head[u];
to[cnt]=v;
head[u]=cnt++;
}
void dfs(int u,int pre){
int num[M];
for(int i=;i<M;i++){
if(a[u]&(<<i)) num[i]=,dp[u][i][]=,dp[u][i][]=;
else num[i]=,dp[u][i][]=,dp[u][i][]=;
}
for(int e=head[u];~e;e=nxt[e]){
int v=to[e];
if(v==pre) continue;
dfs(v,u);
for(int i=;i<M;i++){
int cnt1=dp[u][i][]*dp[v][i][]+dp[u][i][]*dp[v][i][];
res+=1LL*cnt1*(<<i);
if(num[i]){
dp[u][i][]+=dp[v][i][];
dp[u][i][]+=dp[v][i][];
}else{
dp[u][i][]+=dp[v][i][];
dp[u][i][]+=dp[v][i][];
}
}
}
res+=a[u];
}
int main(){
//freopen("in.txt","r",stdin);
while(~scanf("%d",&n)){
for(int i=;i<=n;i++)
scanf("%d",a+i);
init();
for(int i=;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
addEdge(u,v);
addEdge(v,u);
}
dfs(,);
printf("%I64d\n",res);
}
return ;
}

Codeforces 766E的更多相关文章

  1. codeforces 766E Mahmoud and a xor trip

    题目链接:http://codeforces.com/problemset/problem/766/E 大意,给出一个$n$个点的树,每个点都有一个权值,令$Disx$为$u$到$v$路径上的异或和求 ...

  2. 【codeforces 766E】Mahmoud and a xor trip

    [题目链接]:http://codeforces.com/contest/766/problem/E [题意] 定义树上任意两点之间的距离为这条简单路径上经过的点; 那些点上的权值的所有异或; 求任意 ...

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

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

  4. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  5. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  6. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  7. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  8. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  9. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

随机推荐

  1. LINUX-APT 软件工具 (Debian, Ubuntu 以及类似系统)

    apt-get install package_name 安装/更新一个 deb 包 apt-cdrom install package_name 从光盘安装/更新一个 deb 包 apt-get u ...

  2. 利用ajax全局设置实现拦截器

    var token = localStorage.getItem("token"); $.ajaxSetup({ dataType: "json", cache ...

  3. App后台开发运维和架构实践学习总结(4)——APP的注册和登录功能设计

    一.为什么需要注册和登录? 是否需要注册和登录的关键取决于产品形态. 如果用户注册登录对于用户需求.产品功能.商业模式本身带不来任何价值的话,就没必要设计这样的功能.比如一些实用工具类的产品:计算器. ...

  4. Spring MVC学习总结(12)——Spring MVC集成Swagger时报错{"schemaValidationMessages":[

    在springmvc结合swagger的时候,如果将项目部署到服务器上就会出现问题出现下面的图标: 点开会报错误信息: schemaValidationMessages":[{"l ...

  5. win7 32位机安装VMware win7 64位虚拟机

    VMware10虚拟机怎么安装win7系统(详细教程):https://jingyan.baidu.com/article/86f4a73ec62e8f37d65269a1.html 然而上述教程想不 ...

  6. [K/3Cloud] 表单python脚本使用QueryService的做法

    听说有些朋友想在表单里做自定义的界面数据处理,一般来说写个表单插件会很容易解决这类问题.但是鉴于C#插件开发的不便性和实施搭建开发环境的麻烦,在现场做C#开发可能会不太方便(没部署开发环境之类的问题) ...

  7. C# 解决EXCEL单元格合并,行高无法自适应问题

    解决方法:根据单元格内容长度,设置单元格所在行的行高 public static float getExcelCellAutoHeight(string strtest, float fontCoun ...

  8. python实现汉诺塔算法

    汉诺塔 算法分析 1.步骤1:如果是一个盘子,直接将a柱子上的盘子从a移动到c 否则 2.步骤2:先将A柱子上的n-1个盘子借助C移动到B(图1) 已知函数形参为hanoi(n,a,b,c),这里调用 ...

  9. - > 网络流(【最大流】草地排水模板题)

    1993 草地排水 USACO  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 在农夫约翰的农场上,每 ...

  10. strace oracle

    http://www.itpub.net/thread-1865593-1-1.html