题目链接:https://nanti.jisuanke.com/t/39277

题意:给出一棵有边权的树,求所有简单路径包含异或和为0的简单路径的总数和。

思路:

  首先,对于异或为0这一限制,我们通过dfs得到根节点到所有点的路径上的异或和val[i],如果两个结点的val值相等,说明他们之间的路径满足异或和为0。sz [i]为以i为根的子树 的大小。

  其次,对于满足异或和为0的两个点u、v,分两种情况考虑:

    1. u、v在不同链上,这一条路径的贡献值为sz[u]*sz[v],通过map记录每一种权值的size和即可得到。我们先将所有点这样处理一遍。

    2. u、v在一条链上,这一条路径的贡献值为(n-sz[u1])*sz[v],u1是u与v这一条链上u的第一个子结点。因为上一步我们把所有情况加上了,所以要先减去sz[u]*sz[v],通过mp1来记录同一条链上异或值为val的size和,因为是记录同一条链,所以当处理完一个结点的所有子结点时要回溯更新,即减去前面加的size。减了之后加上(n-sz[u1])*sz[v],通过mp2来记录该信息,每处理完一个子结点时回溯更新,因为已经不在一条链上。

AC代码:

#include<cstdio>
#include<algorithm>
#include<unordered_map>
using namespace std; const int maxn=1e5+;
const int MOD=1e9+;
typedef long long LL;
typedef unordered_map<LL,LL> ump;
struct node{
int v,nex;
LL w;
}edge[maxn]; int n,head[maxn],cnt,sz[maxn];
LL val[maxn],ans;
ump sum,mp1,mp2; void adde(int u,int v,LL w){
edge[++cnt].v=v;
edge[cnt].w=w;
edge[cnt].nex=head[u];
head[u]=cnt;
} void dfs1(int u,LL va){
val[u]=va,sz[u]=;
for(int i=head[u];i;i=edge[i].nex){
int v=edge[i].v;
LL w=edge[i].w;
dfs1(v,va^w);
sz[u]+=sz[v];
}
} void dfs2(int u){
ans=(ans+sum[val[u]]*sz[u])%MOD;
sum[val[u]]=(sum[val[u]]+sz[u])%MOD;
for(int i=head[u];i;i=edge[i].nex)
dfs2(edge[i].v);
} void dfs3(int u){
ans=(ans-mp1[val[u]]*sz[u]+mp2[val[u]]*sz[u]+MOD)%MOD;
mp1[val[u]]=(mp1[val[u]]+sz[u])%MOD;
for(int i=head[u];i;i=edge[i].nex){
int v=edge[i].v;
LL w=edge[i].w;
mp2[val[u]]=(mp2[val[u]]+n-sz[v]+MOD)%MOD;
dfs3(v);
mp2[val[u]]=(mp2[val[u]]-n+sz[v]+MOD)%MOD;
}
mp1[val[u]]=(mp1[val[u]]-sz[u]+MOD)%MOD;
} int main(){
scanf("%d",&n);
for(int i=;i<=n;++i){
int u;LL w;
scanf("%d%lld",&u,&w);
adde(u,i,w);
}
dfs1(,);
dfs2();
dfs3();
printf("%lld\n",ans);
return ;
}

2019icpc西安邀请赛 J And And And (树形dp)的更多相关文章

  1. 计蒜客 39272.Tree-树链剖分(点权)+带修改区间异或和 (The 2019 ACM-ICPC China Shannxi Provincial Programming Contest E.) 2019ICPC西安邀请赛现场赛重现赛

    Tree Ming and Hong are playing a simple game called nim game. They have nn piles of stones numbered  ...

  2. 【2019ICPC西安邀请赛】J.And And And(点分治,贡献)

    题意:给定一棵n个点带边权的树,定义每条路径的值为路径上边权的异或和 如果一条路径的值为0,其对答案的贡献为所有包含这条路径的路径条数 求答案膜1e9+7 n<=1e5,0<=边权< ...

  3. 2019ICPC西安邀请赛 - B. Product - 数论

    打印的时候麻烦把:https://blog.csdn.net/skywalkert/article/details/50500009这个打印下来. 求\(\prod\limits_{i=1}^{n} ...

  4. 2019icpc西安邀请赛

    来源:https://www.jisuanke.com/contest/2625?view=challenges 更新中 A.Tasks 直接贪心 代码:听说当时很多队伍提前拆题甚至上机了,所以很多0 ...

  5. 2019ICPC西安邀请赛(计蒜客复现赛)总结

    开始时因为吃饭晚了一刻钟,然后打开比赛.看了眼榜单A题已经过了二十来个队伍了,宝儿就去做A. 传师说最后一题看题目像最短路,于是我就去看M了,宝儿做完之后也来陪我看.M一开始看到时以为是像   POJ ...

  6. 计蒜客 39280.Travel-二分+最短路dijkstra-二分过程中保存结果,因为二分完最后的不一定是结果 (The 2019 ACM-ICPC China Shannxi Provincial Programming Contest M.) 2019ICPC西安邀请赛现场赛重现赛

    Travel There are nn planets in the MOT galaxy, and each planet has a unique number from 1 \sim n1∼n. ...

  7. 计蒜客 39279.Swap-打表找规律 (The 2019 ACM-ICPC China Shannxi Provincial Programming Contest L.) 2019ICPC西安邀请赛现场赛重现赛

    Swap There is a sequence of numbers of length nn, and each number in the sequence is different. Ther ...

  8. 计蒜客 39270.Angel's Journey-简单的计算几何 ((The 2019 ACM-ICPC China Shannxi Provincial Programming Contest C.) 2019ICPC西安邀请赛现场赛重现赛

    Angel's Journey “Miyane!” This day Hana asks Miyako for help again. Hana plays the part of angel on ...

  9. 计蒜客 39268.Tasks-签到 (The 2019 ACM-ICPC China Shannxi Provincial Programming Contest A.) 2019ICPC西安邀请赛现场赛重现赛

    Tasks It's too late now, but you still have too much work to do. There are nn tasks on your list. Th ...

随机推荐

  1. 《30天自制操作系统》学习笔记--Mac下工具的使用

    现在来介绍官网上下的工具怎么用首先是官网地址,书上有个注释上有:hrb.osask.jp 翻译成中文大概是这个样子滴. 上面有两个文件可以下载,一个是工具,一个是工具的源代码,很好的学习资料 下面把工 ...

  2. vundle

    vundle插件的使用方法: http://adam8157.info/blog/2011/12/use-vundle-to-manage-vim-plugins http://adam8157.in ...

  3. Java学习笔记(持续更新ing)

    1.在读入字符串时:    str = sc.nextLine();     //读入一行                                     str = sc.next();   ...

  4. 用java写一个两个任意长度字符串数字和的算法

    package com.cn.test.string; public class StringTest { public static void main(String[] args) { Strin ...

  5. BUUCTF平台-web-边刷边记录-1

    1.WarmUp 思路很清晰,文件包含,漏洞点在代码会二次解码,只需注入一个?就可以使用../../进行路径穿越,然后去包含flag,flag路径在hint.php里面有 2.easy_tornado ...

  6. Netfilter 之 iptable_filter

    概述 本文主要对filter表的初始化流程,以及钩子函数的规则match流程的源码进行分析: 源码分析 所在钩子点: /* 在LOCAL_IN,FORWARD, LOCAL_OUT钩子点工作 */ # ...

  7. flask静态html

    flask使用静态html 在flask并不是所有的html都需要做成动态html,并且做成动态html在使用静态资源时要改变它的路径.所以我们有些可以使用静态html. 静态html不需要后台渲染, ...

  8. QT .pro文件中的变量说明

      https://blog.csdn.net/tanou3212/article/details/79942840 TEMPLATE:定义了工程的编译模式 赋值方式为:TEMPLATE=app (1 ...

  9. ubuntu 14.04 升级到18.04

    http://www.360doc.com/content/18/0929/09/35082563_790606785.shtml

  10. laravel-5.6路由命名

    1.第一种:通过route路由中的as关键字来实现 1 Route::get('api/user',['as'='web.user'],'messageController@userInformati ...