链接:https://ac.nowcoder.com/acm/contest/272/B
来源:牛客网

题目描述

给定一棵n个点的树,每个点有权值。定义表示  到  的最短路径上,所有点的点权异或和。
对于,求所有的异或和。

输入描述:

第一行一个整数n。
接下来n-1行,每行2个整数u,v,表示u,v之间有一条边。
第n+1行有n个整数,表示每个点的权值

输出描述:

输出一个整数,表示所有

的异或和,其中

示例1

输入

复制

4
1 2
1 3
1 4
1 2 3 4

输出

复制

5

说明

再将这6个数异或起来就可以得到答案5了。

备注:


题意:给你一棵树以及树上结点的权值,求任意两点间路径上点权值的异或,再将所有的路径异或起来。
思路分析 :
  通过边的方式去考虑,首先可以知道每条边会用多少次,然后就知道对应的点用了多少次,但是会有重复的
  重复的部分就是借助某点任意两点间的部分,只要减去即可。即 cnt[x] = cnt[x] - (cnt[x]-(n-1))/2;
代码示例:
using namespace std;
#define ll long long
const ll maxn = 5e5+5;
const ll mod = 1e9+7;
const double eps = 1e-9;
const double pi = acos(-1.0);
const ll inf = 0x3f3f3f3f; ll n;
vector<ll>ve[maxn];
ll size[maxn];
ll a[maxn];
ll cnt[maxn]; void dfs_init(ll x, ll fa){
size[x] = 1; for(ll i = 0; i < ve[x].size(); i++){
ll to = ve[x][i];
if (to == fa) continue;
dfs_init(to, x);
size[x] += size[to];
}
}
ll ans = 0;
void dfs(ll x, ll fa){ for(ll i = 0; i < ve[x].size(); i++){
ll to = ve[x][i];
if (to == fa) continue;
ll num = size[to]*(n-size[to]);
cnt[x] += num, cnt[to] += num;
dfs(to, x);
}
} int main() {
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
ll u, v; cin >> n;
for(ll i = 1; i < n; i++){
scanf("%lld%lld", &u, &v);
ve[u].push_back(v);
ve[v].push_back(u);
}
for(ll i = 1; i <= n; i++) scanf("%d", &a[i]); dfs_init(1, 0); dfs(1, 0);
for(ll i = 1; i <= n; i++){
cnt[i] = cnt[i]-(cnt[i]-n+1)/2;
if (cnt[i]&1) ans ^= a[i];
}
printf("%lld\n", ans);
return 0;
}

树dp 统计异或值的更多相关文章

  1. Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset(01字典树求最大异或值)

    http://codeforces.com/contest/706/problem/D 题意:有多种操作,操作1为在字典中加入x这个数,操作2为从字典中删除x这个数,操作3为从字典中找出一个数使得与给 ...

  2. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

  3. BZOJ 1036: [ZJOI2008]树的统计Count-树链剖分(点权)(单点更新、路径节点最值、路径求和)模板,超级认真写了注释啊啊啊

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 23015  Solved: 9336[Submit ...

  4. 51Nod XOR key —— 区间最大异或值 可持久化字典树

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1295 1295 XOR key  题目来源: HackerRa ...

  5. bzoj 2819 Nim dfn序+树状数组维护区间异或值

    题目大意 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略 ...

  6. AcWing:144. 最长异或值路径(dfs + 01字典树)

    给定一个树,树上的边都具有权值. 树中一条路径的异或长度被定义为路径上所有边的权值的异或和: ⊕ 为异或符号. 给定上述的具有n个节点的树,你能找到异或长度最大的路径吗? 输入格式 第一行包含整数n, ...

  7. AcWing 144. 最长异或值路径 01字典树打卡

    给定一个树,树上的边都具有权值. 树中一条路径的异或长度被定义为路径上所有边的权值的异或和: ⊕ 为异或符号. 给定上述的具有n个节点的树,你能找到异或长度最大的路径吗? 输入格式 第一行包含整数n, ...

  8. 线段相交的异或值 (线段树 or 优先队列)

    VVQ 最近迷上了线段这种东西 现在他手上有 n 条线段,他希望在其中找到两条有公共点的线段,使得他们的异或值最大. 定义线段的异或值为它们并的长度减他们交的长度 输入描述: 第一行包括一个正整数 n ...

  9. BZOJ 1036: [ZJOI2008]树的统计Count [树链剖分]【学习笔记】

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 14302  Solved: 5779[Submit ...

随机推荐

  1. Vue 父组件与子组件的传值

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 2019-8-24-win10-uwp-读取文本GBK错误

    title author date CreateTime categories win10 uwp 读取文本GBK错误 lindexi 2019-8-24 16:2:27 +0800 2018-2-1 ...

  3. Acegi框架介绍

    开发四年只会写业务代码,分布式高并发都不会还做程序员?->>>        概述     对于任何一个完整的应用系 统,完善的认证和授权机制是必不可少的.Acegi Securit ...

  4. H3C IPv6地址表示方式

  5. 纯CSS绘制的图形一览

    整理网上一些使用纯CSS绘制的图形示例~~纯属抄袭,哈哈...仅仅是为了自己以后查看! Square(正方形) #square { width: 100px; height: 100px; backg ...

  6. C# 获取 PC 序列号

    在 C++ 需要使用 GetSystemFirmwareTable 的方法来获得 PC 的序列号,需要写的代码很多,但是在 C# 可以使用 WMI 来拿到序列号 首先是安装 System.Manage ...

  7. react-native-swiper使用时候的小坑

    react-native版本:0.61.1 react-native-swiper版本:1.5.14 当时第一次使用时候直接粘贴的别人博客的教程代码,只修改了swiper里面的元素,结果发现不能切换, ...

  8. dotnet 如何调试某个文件是哪个代码创建

    我发现了自己的软件,会在桌面创建一个 1.txt 文件,但是我不知道是哪个代码创建的,那么如何进行快速的调试找到是哪个代码创建的 最简单的方法是使用 VisualStudio 全局搜 1.txt 看是 ...

  9. 微软软件开发技术二十年回顾-.NET框架篇

    六. .NET框架篇 .NET是微软自从发布Windows 3.0以来最为激动人心的新技术,是微软战略上为下一个十年对服务器和桌面软件工程的第一步,是微软的一场世纪大豪赌.对于.NET,微软的定义是, ...

  10. HDU4609 FFT+组合计数

    HDU4609 FFT+组合计数 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意: 找出n根木棍中取出三根木棍可以组成三角形的概率 题解: ...