首页 > 其他分享 >ABC201E Xor Distances 题解

ABC201E Xor Distances 题解

时间:2024-08-10 11:38:03浏览次数:17  
标签:Distances cnt limits int 题解 sum ABC201E large 异或

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;
}

标签:Distances,cnt,limits,int,题解,sum,ABC201E,large,异或
From: https://www.cnblogs.com/sorato/p/18343522

相关文章

  • 洛谷 P1127 词链——题解
    洛谷P1127题解传送锚点摸鱼环节词链题目描述如果单词\(X\)的末字母与单词\(Y\)的首字母相同,则\(X\)与\(Y\)可以相连成\(X.Y\)。(注意:\(X\)、\(Y\)之间是英文的句号.)。例如,单词dog与单词gopher,则dog与gopher可以相连成dog.gopher。另外还有一些例子:dog......
  • CF1155C 题解
    题目传送门题目大意:给定一个长度为\(n\)的单增序列\(a\)和一个长度为\(m\)的序列\(b\),询问是否存在一个正整数\(y\)使得\(a_1\equiva_2\equiv\cdots\equiva_n\equivy\space(\bmod\spacep)\),且\(p\)在序列\(b\)中出现过。思路:将条件转化一下,得:是否存在一个......
  • 08-08 题解
    08-08题解地址A-CF1420Eluogu翻译更正ifhegivesnomorethatkorders对于至多k次操作,题面没有翻译出来思路怎么算贡献?贡献(被保护)出现在「处在任意两个不同的0的连续段的守卫」之间,而处于同一连续段的守卫之间没有贡献设一共\(cnt\)个\(0\),每个连续......
  • 提高组:玩具谜题 题解
    题目描述小南有一套可爱的玩具小人,它们各有不同的职业。有一天,这些玩具小人把小南的眼镜藏了起来。小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图:这时singer告诉小南一个谜题:“眼镜藏在我左数第 33 个玩具小人的右数第 11 个玩具小人的左数第......
  • 08-09 题解
    08-09题解A小水题思路假设我们选定了当前子序列的绝对众数\(x\),那么该序列里最多再放\(num_x-1\)个其他数字为了分出最少的子序列,肯定要让每个子序列在拥有绝对众数的同时能消化尽量多的其他数字由此,可以得到一个贪心策略:每次取出出现次数最多的一个数字,消掉出现......
  • P1725 琪露诺 题解
    思路动态规划,单调队列动态规划观察题目,发现下标为\(i\)的点只能对\([i+l,i+r]\)区间的点产生贡献。设\(f_i\)为到达点\(i\)时的最大冻结指数。易得状态转移方程式:\(f_k\leftarrow\max(f_k,f_i+a_k),(k\in[i+l,i+r])\)。若直接对该方程进行转移,时间复......
  • AT_abc208_d 题解
    题目传送门做完这道题后感觉对Floyd的理解更深了。根据题面要求,设\(f(k,i,j)\)表示从\(i\)到\(j\)的所有只经过\(1\simk\)的点的所有路径的最短距离。很明显\(k\)那一维是阶段,因为它描述了从\(i\)到\(j\)路径中的不同点,而我们就是根据这一条件来划分集合,这......
  • CF908D New Year and Arbitrary Arrangement 题解
    Description给定\(k,pa,pb\),有一初始为空的序列。每次有\(\dfrac{pa}{pa+pb}\)的概率往序列后面加一个a。每次有\(\dfrac{pb}{pa+pb}\)的概率往序列后面加一个b。当出现大于等于\(k\)个形如ab的子序列(a和b不一定相邻)时停止。求序列最终的ab子序列期望数。So......
  • 【保奖思路】2024年华为杯研究生数学建模D题解题思路分享(点个关注,后续会更新
    您的点赞收藏是我继续更新的最大动力!一定要点击如下的卡片链接,那是获取资料的入口!点击链接加入群聊【2024华为杯研赛资料汇】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=MwNruKbEvR9aZns1l7xXBWmQQKYAEh-F&authKey=igaBN79pz6BhNlDQ6TIZ5YFAbn71aDcYL77uANPquLF%2FTVgeSAhE......
  • 【保奖思路】2024年华为杯研究生数学建模D题解题思路分享(点个关注,后续会更新
    您的点赞收藏是我继续更新的最大动力!一定要点击如下的卡片链接,那是获取资料的入口!点击链接加入群聊【2024华为杯研赛资料汇】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=MwNruKbEvR9aZns1l7xXBWmQQKYAEh-F&authKey=igaBN79pz6BhNlDQ6TIZ5YFAbn71aDcYL77uANPquLF%2FTVgeSAhE......