ABC201E Xor Distances 题解

news/2024/11/16 15:28:58/文章来源:https://www.cnblogs.com/sorato/p/18343522

ABC201E Xor Distances 题解

题目大意

给定一个带权树,求树上每两点的简单路径上的边权的异或和的和。

形式化的,定义 \(dis(i,j)\)\(i\)\(j\) 的简单路径上的边权的异或和,求 \(\large\sum\limits_{i=1}^n\sum\limits_{j=i+1}^n\text{dis}(i,j)\)

Solve

\(\large f(u)=\sum\limits_{i=1}^n\text{dis}(u,i)\)

指定 \(1\) 为根,考虑先 dfs 遍历树求出 \(f(1)\),然后换根 \(\text{DP}\)

若已知 \(f(u)\),对于 \(v\in son_u\),我们分两部分考虑,即在子树 \(v\) 中的 \(A\) 集合和不在子树 \(v\) 中的 \(B\) 集合。

  • 对于 \(B\) 中的点,根从 \(u\) 转移到 \(v\),他们到根的路径的异或和会多异或上 \(w(u,v)\)
  • 对于 \(A\) 中的店,他们到根的路径的异或和会少异或上 \(w(u,v)\),由于异或的自反性,通过再异或上一个 \(w(u,v)\) 也可以实现。

综上,\(f(v)\) 即为 \(f(u)\) 的每一项异或上 \(w(u,v)\) 的和,即 \(\large f(v)=\sum\limits_{i=1}^n dis(u,i)\oplus w(u,v)\)

考虑如何计算。

不难想到:用 \(cnt\) 记录下 \(f(u)\) 的每一项 \(x\) 二进制下 \(1\)\(0\) 的个数,按位枚举 \(w(u,v)\),若其第 \(i\) 位为 \(1\),则 \(x\oplus w(u,v)\) 后第 \(i\) 位会与原来相反,所以此时交换 \(cnt_{i,1}\)\(cnt_{i,0}\)

经过交换后,我们有 \(\large f(v)=\sum\limits_{i=0}^{m-1}2^i\times cnt_{i,1}\)。本题 \(w\leq2^{60}\),故 \(m=60\)

答案即为 \(\large\frac {\sum\limits_{u=1}^nf(u)} 2\)

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read()
{short f=1;int x=0;char c=getchar();while(c<'0'||c>'9')	{if(c=='-')	f=-1;c=getchar();}while(c>='0'&&c<='9')	x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
#define mod 1000000007
int n,cnt[60][2],ans,mi[60]={1};
#define PII pair<int,int>
vector<PII>e[200010];
void dfs1(int u,int d,int fa)
{for(int i=59;i>=0;i--)	cnt[i][d>>i&1]++;for(auto i:e[u])if(i.first!=fa)	dfs1(i.first,d^i.second,u);
}
void dfs2(int u,int fa)
{for(int i=59;i>=0;i--)	ans=(ans+mi[i]*cnt[i][1]%mod)%mod;for(auto i:e[u])if(i.first!=fa){for(int j=59;j>=0;j--)if(i.second>>j&1)swap(cnt[j][1],cnt[j][0]);dfs2(i.first,u);for(int j=59;j>=0;j--)if(i.second>>j&1)swap(cnt[j][1],cnt[j][0]);}
}
signed main()
{n=read();for(int i=1;i<60;i=-~i)	mi[i]=(mi[i-1]<<1)%mod;for(int i=1,u,v,w;i<n;i=-~i)u=read(),v=read(),w=read(),e[u].push_back({v,w}),e[v].push_back({u,w});dfs1(1,0,0);dfs2(1,0);return printf("%lld",ans*500000004/*显然这是2在mod 1e9+7下的逆元*/%mod),0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/780798.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学生Java学习路程-6

ok,到了一周一次的总结时刻,我大致会有下面几个方面的论述:1.这周学习了Java的那些东西2.这周遇到了什么苦难3.未来是否需要改进方法等几个方面阐述我的学习路程。 复习面向对象数组 数组的三种初始化方法:默认,静态,动态引用类型Man放入数组中的测试代码数组的拷贝 使用…

Lazysysadmin靶机笔记

Lazysysadmin靶机笔记 概述 lazysysadmin是一台Vulnhub靶机,整体比较简单,要对一些存在服务弱口令比较敏感。 靶机地址:https://pan.baidu.com/s/19nBjhMpGkdBDBFSnMEDfOg?pwd=heyj 提取码:heyj 一、nmap扫描 1、主机发现 # -sn只做ping扫描,不做端口扫描 sudo nmap -sn 1…

图片压缩保证让你看的明明白白

场景 很多时候,都会遇见图片上传的场景。 在上传给服务器之前。 前端为了节省服务器的存储空间。 会对图片进行压缩。 下面我们来一起学习一下图片压缩。 图片压缩的步骤: 1.选择图片。使用 <input type="file">来实现 2.将选择的图片显示出来。 获取到图片的…

学前准备工作

什么是计算机computer:全称电子计算机,简称电脑。 能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备 由软件和硬件组成 常见形式有台式计算机,笔记本计算机,大型计算机等 广泛应用在:科学计算、数据处理、自动控制、计算机辅助设计、人工智能等领域。计算机…

多元时间序列分析统计学基础:基本概念、VMA、VAR和VARMA

多元时间序列是一个在大学课程中经常未被提及的话题。但是现实世界的数据通常具有多个维度,所以需要多元时间序列分析技术。在这文章我们将通过可视化和Python实现来学习多元时间序列概念。这里假设读者已经了解单变量时间序列分析。 1、什么是多元时间序列? 顾名思义,多元时…

wqs二分

wqs二分 用来处理一类带有限制的问题,如恰好选 \(k\) 个,本质是通过二分来规避这个选取数量的限制。 使用前提:原问题具有凹凸性。设 \(g_i\) 表示选 \(i\) 个物品的答案,那么所有 \((i, g_i)\) 点组成一个凸包,满足 \(g(k)\) 单调。 这类题目通常有以下特点:如果不限制选…

IDEA Sonar 扫描

1. 修改SonarQube-7.7\conf\sonar.properties数据库配置2. 启动SonarQube-7.7\bin\windows-x86-64\StartSonar.bat,打开 localhost:9000,账密 admin / admin3. pom文件配置:<profiles><profile><id>sonar</id><properties><sonar.host.url…

[AGC052B] Tree Edges XOR

好题,可以直接作为套路记录一下。 [AGC052B] Tree Edges XOR 题目大意: 给你一棵树,有奇数个点,每个边有边权 \(w_i\)。每次你可以选出一条边,将和这条边的所有相邻的边都异或这条边的边权,问你能否得到最终状态(操作次数不定)。 思路: 首先,上来会发现每次操作影响的…

[JVM] 应用诊断工具之java命令

0 序本章对java命令的使用、最佳实践进行全方位的总结。1 java命令 1.0 场景:查看版本方法1# java -version java version "1.8.0_261" Java(TM) SE Runtime Environment (build 1.8.0_261-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.261-b12, mixed mode)方…

洛谷 P1127 词链——题解

洛谷P1127题解传送锚点摸鱼环节 词链 题目描述 如果单词 \(X\) 的末字母与单词 \(Y\) 的首字母相同,则 \(X\) 与 \(Y\) 可以相连成 \(X.Y\)。(注意:\(X\)、\(Y\) 之间是英文的句号 .)。例如,单词 dog 与单词 gopher,则 dog 与 gopher 可以相连成 dog.gopher。 另外还有一…

引领敏捷潮流:首届中国Scrum大会即将揭幕

中国「首届Scrum大会」将于2024年8月17日在上海大华虹桥假日酒店盛大召开。在全球数字化转型的浪潮中,敏捷已成为企业脱颖而出的关键。本次大会汇聚了Scrum领域的顶尖专家、实践者及企业领袖,共同探讨AI时代下的敏捷(Agile in the AI Age),深入探索智能时代的敏捷路径,掌…