[ABC201E] Xor Distances 题解
题目大意
给定一颗带边权无根树,定义 \(\text{dis}(i,j)\) 表示 \(i,j\) 两点在树上的最短路径的边权的异或和。求:
\]
思路分析
首先,容易证明:
\]
这个式子告诉我们,无论以哪个点作为树的根,树上两点之间的最短路径的边权的异或和等于两点到根的最短路径的边权的异或和的异或。(感性理解就是公共部分被异或了两次消掉了)
那么不妨设 \(1\) 为根,先 dfs 一遍求出根到每个点的异或和,再考虑统计答案。
由于异或的每一位是独立的,因此不妨对每一位考虑对答案的贡献。
注意到,只有 \(0\oplus1=1\) 会对答案产生贡献,因此可以得出答案的计算式:
\]
其中,\(p_i\) 表示在所有的异或和中,第 \(i\) 位是 \(1\) 的数量,\(n-p_i\) 就是第 \(i\) 位是 \(0\) 的数量,根据乘法原理,总贡献就是 \(2^ip_i(n-p_i)\)。
时间复杂度为 \(O(n\log V)\),其中 \(V\) 为异或和的值域。
证明过程:
记 \(\text{lca}(i,j)\) 为 \(m\)。
\]
代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=400200,mod=1000000007;
int to[N],nxt[N],head[N];
int w[N],dis[N],ans;
int n,in1,in2,idx=1,in3;
void add(int u,int v,int c){
idx++;to[idx]=v;nxt[idx]=head[u];head[u]=idx;w[idx]=c;
}
void dfs(int s,int fa){
for(int i=head[s];i;i=nxt[i]){
int v=to[i];
if(v==fa) continue;
dis[v]=dis[s]^w[i];//递推异或和
dfs(v,s);
}
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<n;i++){
scanf("%lld%lld%lld",&in1,&in2,&in3);
add(in1,in2,in3);add(in2,in1,in3);
}
dfs(1,0);
for(int i=0;i<60;i++){//最多 60 位
int cnt=0;
for(int j=1;j<=n;j++)
if(dis[j]>>i&1) cnt++;
int temp=(1ll<<i)%mod;
int temp2=cnt*(n-cnt)%mod;
ans=(ans+temp*temp2%mod)%mod;
}
cout<<ans<<'\n';
return 0;
}
[ABC201E] Xor Distances 题解的更多相关文章
- HDU4825:Xor Sum——题解
http://acm.hdu.edu.cn/showproblem.php?pid=4825 Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含 ...
- [CF959F]Mahmoud and Ehab and yet another xor task题解
搞n个线性基,然后每次在上一次的基础上插入读入的数,前缀和线性基,或者说珂持久化线性基. 然后一个num数组记录当时线性基里有多少数 然后每次前缀操作一下就珂以了 代码 #include <cs ...
- AT2272 [ARC066B] Xor Sum 题解
题目连接:传送门 分析 这道题只看题目中给的样例是找不出规律的 所以我们可以打一下表 1, 2, 4, 5, 8, 10, 13, 14, 18 如果你还是没有看出什么规律的话,我们可以从OEIS上搜 ...
- AGC016D - XOR Replace 置换/轮换
目录 题目链接 题解 代码 题目链接 AGC016D - XOR Replace 题解 可以发现一次操作相当于一次置换 对于每个a上的位置映射到b对应 可以找到置换群中的 所有轮换 一个k个元素的轮换 ...
- P9033题解
P9033「KDOI-04」XOR Sum 题解 题目链接 传送门 题意简述 构造一个长度为 \(n\),值域为 \([0,m]\) 的异或和为 \(k\) 的序列,如果不存在则输出 \(-1\). ...
- [洛谷P4717]【模板】快速沃尔什变换
题目大意:给定多项式$A$和$B$,求$C$满足: $$C_n=\sum\limits_{x\oplus y=n}A_xB_y$$ 其中$\oplus$为位运算($or,and,xor$) 题解:$ ...
- bzoj4568 [Scoi2016]幸运数字 线性基+树链剖分
A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一些旅行者希望游览 A ...
- poj 3225 【线段树】
poj 3225 这题是用线段树解决区间问题,看了两天多,算是理解一点了. Description LogLoader, Inc. is a company specialized in provid ...
- BZOJ2337:[HNOI2011]XOR和路径——题解
+++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...
- 【第400篇题解纪念2016年10月28日】【28.10%】【codeforces 617E】XOR and Favorite Number
time limit per test4 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
随机推荐
- Collection 接口及其常用方法
Collection 接口的特点 Collection接口没有直接实现类,提供了更具体的子接口(如Set和List)的实现.Collection实现类(通常通过其中一个子接口间接实现Collectio ...
- 【Oracle】行转列的函数wm_concat,listagg,xmlagg,pivot以及动态行转列
[Oracle]行转列的几种情况 表的数据如下 朴实无华的函数 1.wm_concat 使用格式: select 分组字段,wm_concat(要转换的列名) from 表名 group by 分组字 ...
- LEA: Improving Sentence Similarity Robustness to Typos Using Lexical Attention Bias 论文阅读
LEA: Improving Sentence Similarity Robustness to Typos Using Lexical Attention Bias 论文阅读 KDD 2023 原文 ...
- 利用python分析pdf数据,分析上市公司财报
import re import os.path import matplotlib import matplotlib.pyplot as plt from pdfminer.pdfparser i ...
- node.js中kafka的封装和高并发消费限流优雅降级以及egg-kafka的封装说明
HI!,你好,我是zane,zanePerfor是一款我开发的一个前端性能监控平台,现在支持web浏览器端和微信小程序端. 我定义为一款完整,高性能,高可用的前端性能监控系统,这是未来会达到的目的,现 ...
- 新一代Kerberos攻击 钻石票据与蓝宝石票据
新一代Kerberos攻击 | 钻石票据与蓝宝石票据 0x01 前言 在了解票据攻击的过程中,看见了一篇文章使用Rubeus进行钻石票据攻击.但是没有原理,于是抱着学习的心态在Google上寻找文章发 ...
- 【路由器】OpenWrt 手动编译 ipk
目录 .ipk 文件 编译准备 编译 .ipk 文件 更新 feeds 配置平台 获取交叉编译链 添加需要编译的第三方软件包 参考资料 .ipk 文件 .ipk 文件是可以通过 OpenWrt 的包管 ...
- 商品详情api接口的应用方向有哪些?
商品详情API接口的应用方向非常广泛,可以应用于以下领域: 电子商务平台:商品详情API接口可以提供商品的基本信息,如名称.描述.价格.图片等,帮助电子商务平台展示和推荐商品.此外,还可以提供商品 ...
- MATLAB入门小操作(数据类型)
这是一篇有助于快速上手MATLAB软件的文章(新手向).(学习过其他的语言更容易看懂) 数据类型 这篇文章我想从MATLAB中的数据类型出发去列举一些经常使用的操作.MATLAB中的数据类型包括其他语 ...
- 关于XXLJOB集群模式下调度失败的问题
xxljob在集群模式下调度高频任务时,有时会出现调度失败的问题,具体报错如下: java.io.EOFException: HttpConnectionOverHTTP@6be8bf0c(l:/10 ...