[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 ...
随机推荐
- 【原创】xenomai内核解析-xenomai实时线程创建流程
版权声明:本文为本文为博主原创文章,未经同意,禁止转载.如有错误,欢迎指正,博客地址:https://www.cnblogs.com/wsg1100/ 目录 问题概述 1 libCobalt中调用非实 ...
- 【干货向】我想试试教会你如何修改Git提交信息
Git是目前IT行业使用率最高的版本控制系统,相信大家在日常工作中也经常使用,每次Git提交都会包含提交信息,常用的包括说明.提交人和提交时间等,此篇文章主要向大家介绍下如何修改这些信息,这些命令在正 ...
- PDF书签的编辑器,基于(python、Tkinter)
使用 脚本 在github下载源码. 安装python3 安装必要的python包 pip install numpy pip install pandas pip install PyMuPDF p ...
- Linux下手工编译libiconv库的小问题
我的电脑是 Ubuntu 14.04 LTS, 自己手工编译 php5.6, 打开 ZEND_EXTRA_LIBS='-liconv' 时, 发现没有安装 libiconv, 也就是编码转换的库, 所 ...
- volatile是如何保证有序性的?
为什么需要保证有序性? 有如下代码,在int i = a;执行了的情况下,i的值最终会为几? public class NoVolatileExample { int a = 0; boolean f ...
- 想在golang里用好泛型还挺难的
golang的泛型已经出来了一年多了,从提案被接受开始我就在关注泛型了,如今不管是在生产环境还是开源项目里我都写了不少泛型代码,是时候全面得回顾下golang泛型的使用体验了. 先说说结论,好用是好用 ...
- CPU摸鱼被抓,上了一个新技术!
我叫阿Q,是CPU一号车间里的员工,我所在的这个CPU足足有8个核,就有8个车间,干起活来杠杠滴. 我们CPU的任务就是执行程序员编写的程序,只不过程序员编写的是高级语言代码,而我们执行的是这些代码被 ...
- 部署基于etcd的coredns集群
前言 现需要为公司搭建私有DNS,私有服务器都使用私有DNS的地址,便于访问内部自定义的域名.采用CoreDNS + ETCD方案部署,coredns和etcd都以三实例运行,etcd为集群模式,使用 ...
- [clickhouse]同步MySQL
前言 clickhouse的查询速度非常快,而且兼容大部分MySQL的sql语法,因此一般将clickhouse作为MySQL的读库. 本文提供两种clickhouse同步MySQL的方式 click ...
- Linux:通过ssh访问虚拟机
好记性抵不过烂笔头.(过段时间用的时候,总要百度一下,别费这个时间了) 语法: ssh -p port username@IP #默认22端口,可省略"-p port",即:ssh ...