异或的常用性质

news/2024/9/19 8:38:01/文章来源:https://www.cnblogs.com/zhengchenxi/p/18357003

性质

1.

百度百科给的

最主要的性质就是归零和结合,其他的就都是拓展了。
例题:P1469

2.

\(a \bigoplus b<=a+b\)

关于这个不等式比较好的理解为异或就是不进位的加法
例题:luoguP5514

应用

异或哈希

异或跟hash一样,也是会发生冲突的
例如:$1 \bigoplus 2 = 5 \bigoplus 6 $
那我们要怎么去避免冲突呢,我们就可以借助hash的思想,对异或值做一个映射,或基于一个base来达成。

来看这道题,我们先来分析Crying的必胜策略:
假设Crying首先拿最小的数,如果最小的数有奇数个,那Crying会赢,如果为偶数个,那Crying肯定不会上来就拿最小的数,而是先去考虑拿第二小的数,那同样如果第二小的数为奇数个,Crying胜,如果为偶数个,那就接着考虑第三小的数,以此类推……
那转化一下题意就是求保证路径上每个数字不会出现偶数次的路径,再转化一下那这就是要保证路径的异或和不为 \(0\) (异或的归零性质,相同的数两两相抵消)。
但是,这样就会出现一个问题:异或冲突
我们就可以用上面的方法来避免这个问题,那这题就好办了,我们加边的时候给边权乘一个base,然后dfs跑一遍每个点到根节点的异或和,最后统计一下。这个时间限制不支持\(O(n^2)\)的操作,我们就可以开个map存一下dis相同的个数,最后减去即可。
点击查看代码
#include<bits/stdc++.h>
using namespace std;#define int long long
const int N=5e6+107;
int n;int read()
{int f=1,s=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){s=(s<<1)+(s<<3)+(ch^48);ch=getchar();}return f*s;
}unsigned long long qpow(unsigned long long a,int b)
{unsigned long long ans=1;while(b){if(b&1) ans=ans*a;a=a*a;b=b>>1;}return ans;
}int h[N],to[N],nxt[N],w[N],tot;
void add(int x,int y,int dt)
{to[++tot]=y;nxt[tot]=h[x];w[tot]=dt;h[x]=tot;
}
unordered_map<int,int>mp,vis;int dis[N];
void dfs(int u,int fa)
{for(int i=h[u];i;i=nxt[i]){int v=to[i];if(v==fa) continue;dis[v]=dis[u]^w[i];dfs(v,u);}mp[dis[u]]++;
}void clear()
{memset(h,0,sizeof h);mp.clear(); vis.clear();tot=0;
}signed main()
{int T=read();while(T--){clear();n=read();for(int i=1;i<=n-1;i++){int x=read(),y=read(),dt=qpow(237,read()+1);add(x,y,dt); add(y,x,dt);}dfs(1,0);int ans=n*(n-1)/2;for(int i=1;i<=n;i++){if(vis[dis[i]]) continue;ans-=mp[dis[i]]*(mp[dis[i]]-1)/2;vis[dis[i]]=1;}printf("%lld\n",ans);}
}

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

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

相关文章

虚拟机的搭建

1.Download VMware Workstation 下载和安装关注微信公众号“软件安装大神”找到虚拟机VMware16 2.DownloadingKali Linux 搜索官网:Kali Linux | Penetration Testing and Ethical Hacking Linux Distribution 解压,然后在第一步 虚拟机VMware16安装成功后打开第二部解压文…

AcWing 1078. 旅游规划 (DFS找树的直径+直径中点性质求解,无DP)

原题链接 题目描述算法 引用自 树的直径 - OI-Wiki:若树上所有边边权均为正,则树的所有直径中点重合 证明:使用反证法。设两条中点不重合的直径分别为 \(\delta(s,t) 与 \delta(s,t)\),中点分别为 \(x\) 与 \(x\)。显然,\(\delta(s,x) = \delta(x,t) = \delta(s,x) = \del…

世上最好的共享内存(Linux共享内存最透彻的一篇)------宋宝华

共享单车、共享充电宝、共享雨伞,世间的共享有千万种,而我独爱共享内存。 早期的共享内存,着重于强调把同一片内存,map到多个进程的虚拟地址空间(在相应进程找到一个VMA区域),以便于CPU可以在各个进程访问到这片内存。现阶段广泛应用于多媒体、Graphics领域的共享内存方…

P7706 文文的摄影布置 题解

一道不错的线段树题P7706 文文的摄影布置 题解 原题 读完题,发现是线段树。单点修改+区间查询。 不过查询的值有些奇怪,就是了,我们考虑用线段树维护这个 ψ 值(下称待求值)。 对于一个区间的待求值,大概有四种情况:如上图四种情况分别为:待求值最大值在左区间 待求值最大…

信息学奥赛初赛天天练-71-NOIP2016普及组-基础题2-进制转换、二进制转八进制、八进制转二进制、二叉树数组存储、寻址空间

NOIP 2016 普及组 基础题2 4 以下不是 CPU 生产厂商的是( ) A Intel B AMD C Microsoft D IBM 8 与二进制小数 0.1相等的八进制数是( ) A 0.8 B 0.4 C 0.2 D 0.1 9 以下是 32 位机器和 64 位机器的区别是( ) A 显示器不同 B 硬盘大小不同 C 寻…

CF 2001 E2 solution (967 Div.2)

CF 2001 E2 由于对称,所以设 \(heap[u]\) 为两次确定堆,且第一次弹出的是 \(u\),\(heap[u,v]\) 是第一次 \(u\) ,第二次 \(v\) 则答案就是 \(\sum heap[u]=2^{n-1}heap[x]\) 其中 \(x\) 任意。 不妨我们考虑第一次都是从第一个叶子弹出,那么对于其他不同的第二个弹出的点…

pytest和unittest的几个区别

主要区别1、安装需求:  pytest:作为第三方单元测试库,需要额外安装。  unittest:是Python标准库的一部分,无需额外安装。2、用例编写规则:  pytest:编写规则较为简单,兼容性好,可以执行unittest风格的测试用例,无需修改unittest用例的任何代码。  unittest:…

【Linux】分区向左扩容的方法

@目录为什么是向左扩容操作前的备份方法:启动盘试用Ubuntu后进行操作为什么是向左扩容 Linux向右扩容非常简单,无论是系统自带的disks工具还是apt安装的gparted工具,都有图像化的界面可以操作。但是,都不支持向左扩容。笔者这里的磁盘情况如下:其中磁盘1的99.5GB是我的Lin…

linux开机自启脚本运行完之后不关闭应用程序

最近在用petalinux2323.2版本编译的系统镜像,想在系统开机后自动运行程序,发现按照2021.2相同的方式启动之后,软件在开机脚本运行完就会自动退出了,经过查找发现petalinux2023.2编译的镜像默认使用的systemd去运行开机脚本,而2021.2是使用的init.d。在systemd方式下需要在…

读懂财务报表:解密资产负债率与净资产收益率

一、概述 财务报表中隐藏着大量的信息,如果我们在解读时缺乏系统的思路或忽略了关键指标,就很容易被庞杂的数据搞得不知所措。本文将从几个重要指标出发,包括资产负债率、净资产收益率和销售复合增长率的计算与分析,帮助大家更精准地理解财务报表。二、财务报表的重点 首先…

陶瓷基板

【附在每个笔记前面:个人学习记录,如有错误,烦请指正,不胜感激。】一、组成:基片+膜层(基于行业局限性,暂时只看金属化薄膜基板,厚膜下次找机会再学习下) ① 基片材质: 氧化铝、氮化铝、碳化硅、金刚石 受制于成形工艺:即烧型、研磨型、抛光型在公差、表面粗糙…

人工智能 | 结对编程助手GithubCopilot

简介 GitHub Copilot 是一款 AI 结对程序员,可帮助您更快、更少地编写代码。它从注释和代码中提取上下文,以立即建议单独的行和整个函数。GitHub Copilot 由 GitHub、OpenAI 和 Microsoft 开发的生成式 AI 模型提供支持。它可作为 Visual Studio Code、Visual Studio、Neovim…