【学习笔记】[ABC274Ex] XOR Sum of Arrays

有点难😅

真的是 A B C ABC ABC的难度吗😅

非常精妙的哈希题目。

定义矩阵乘法: c i , j = ⊕ ( a i , k & b k , j ) c_{i,j}=\oplus (a_{i,k}\& b_{k,j}) ci,j=(ai,k&bk,j)

之所以可以矩阵乘法是因为满足 ( a ⊕ b ) & c = ( a & c ) ⊕ ( b & c ) (a\oplus b)\& c=(a\& c)\oplus (b\& c) (ab)&c=(a&c)(b&c)

其实非常好验证,就把两个运算符按顺序写下来,然后把括号拆开,看等式两边是否恒等即可。

定义对于序列 { a i } \{a_i\} {ai}的哈希规则为,将每个 a k a_k ak与上 k − 1 k-1 k1 p p p后的结果全部异或起来

因为 ( a ⊕ b ) & p = ( a & p ) ⊕ ( b & p ) (a\oplus b)\&p=(a\& p)\oplus (b\& p) (ab)&p=(a&p)(b&p),所以如果 c i = a i ⊕ b i c_i=a_i\oplus b_i ci=aibi,那么 { c i } \{c_i\} {ci}的哈希值就是把 { a i } \{a_i\} {ai} { b i } \{b_i\} {bi}对应的哈希值异或起来

但是发现与上的 p p p都是相同的,所以这个方案冲突的概率很大

仔细观察正解的代码,发现他是把 p p p设计成了一个 M × M M\times M M×M 01 01 01矩阵 (其中 M M M表示二进制位数,也就是 64 64 64), a i a_i ai看成一个长度为 M M M 01 01 01向量 ,这个向量的第 i i i位就是 a i a_i ai在二进制下的第 i i i

不妨形式化的写一下,首先我们随机一个矩阵 p p p,哈希值就是 ⊕ i = 1 n v i p i − 1 \oplus_{i=1}^nv_ip^{i-1} i=1nvipi1。发现 c i = a i ⊕ b i c_{i}=a_{i}\oplus b_{i} ci=aibi那不就是把两个向量做按位异或吗。

直接倍增的复杂度是 O ( n M 3 log ⁡ n ) O(nM^3\log n) O(nM3logn),考虑优化。

注意到是 01 01 01矩阵,所以可以把同一行压成一个 64 64 64位整数,这样转移优化到了 O ( M 2 ) O(M^2) O(M2)

最终复杂度 O ( n M 2 log ⁡ n ) O(nM^2\log n) O(nM2logn)。瓶颈在于倍增预处理,不知道可不可以做的更好。

#include<bits/stdc++.h>
#define ll long long
#define fi first
#define ull unsigned long long
using namespace std;
const int N=5e5+5;
const int M=64;
mt19937_64 t(time(0));
struct Matrix{ull c[M];Matrix(){memset(c,0,sizeof c);}Matrix operator *(const Matrix &a)const{Matrix r;for(int i=0;i<M;i++){for(int j=0;j<M;j++){if(c[i]>>j&1){r.c[i]^=a.c[j];}}}return r;}
}pw[20];
int n,m;
ll a[N];
ull st[N][20];
ull get(ull x,Matrix y){ull res(0);for(int i=0;i<M;i++){if(x>>i&1)res^=y.c[i];}return res;
}
void write(ull x){if(x<10){cout<<(char)('0'+x);return;}write(x/10),cout<<(char)('0'+x%10);
}
int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>m;srand(time(0));for(int i=1;i<=n;i++)cin>>a[i],st[i][0]=a[i];for(int i=0;i<M;i++){pw[0].c[i]=t();}for(int i=1;i<20;i++)pw[i]=pw[i-1]*pw[i-1];for(int j=1;j<20;j++){for(int i=1;i<=n-(1<<j)+1;i++){st[i][j]=st[i][j-1]^get(st[i+(1<<j-1)][j-1],pw[j-1]);}}for(int i=1;i<=m;i++){int b,c,d,e,f,g;cin>>b>>c>>d>>e>>f>>g;for(int j=19;j>=0;j--){if(b+(1<<j)-1<=c&&f+(1<<j)-1<=g&&(st[b][j]^st[d][j])==st[f][j]){b+=(1<<j),d+=(1<<j),f+=(1<<j);}}if(b>c){if(f>g)cout<<"No"<<"\n";else cout<<"Yes"<<"\n";}else{if(f>g)cout<<"No"<<"\n";else if((a[b]^a[d])<a[f])cout<<"Yes"<<"\n";else cout<<"No"<<"\n";}}
}

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

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

相关文章

Java设计模式-职责链模式

1 概述 在现实生活中&#xff0c;常常会出现这样的事例&#xff1a;一个请求有多个对象可以处理&#xff0c;但每个对象的处理条件或权限不同。例如&#xff0c;公司员工请假&#xff0c;可批假的领导有部门负责人、副总经理、总经理等&#xff0c;但每个领导能批准的天数不同…

【ArcGIS微课1000例】0073:ArcGIS探索性回归分析案例

一、探索性回归工具简介 “探索性回归”工具会对输入的候选解释变量的所有可能组合进行评估,以便根据用户所指定的指标来查找能够最好地对因变量做出解释的 OLS 模型。 给定一组候选解释变量,找出正确指定的 OLS 模型: 用法: 工具还会生成一个可选表,该表包括所有满足…

Go和Java实现责任链模式

Go和Java实现责任链模式 下面通过一个审批流程的案例来说明责任链模式的使用。 1、责任链模式 责任链模式为请求创建了一个接收者对象的链。这种模式给予请求的类型&#xff0c;对请求的发送者和接收者进行解耦。这 种类型的设计模式属于行为型模式。 在这种模式中&#x…

React re-render

What is&#xff1f; react的渲染分为两个阶段: render&#xff0c;组件第一次出现在屏幕上的时候触发re-render&#xff0c; 组件第一次渲染之后的渲染 当app的数据更新时(用户手动更新、或异步请求)。 When&#xff1f; re-render发生有四种可能&#xff1a; state改变…

06-Numpy基础-线性代数

线性代数&#xff08;如矩阵乘法、矩阵分解、行列式以及其他方阵数学等&#xff09;是任何数组库的重要组成部分。 NumPy提供了一个用于矩阵乘法的dot函数&#xff08;既是一个数组方法也是numpy命名空间中的一个函数&#xff09; x.dot(y)等价于np.dot(x, y) 符&#xff08;…

2023年高教社杯 国赛数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 描述 …

当数据库表中某个字段内容很大带来的影响

目录 影响原因 影响原因 当某个字段的内容比较大时&#xff0c;会导致查询缓慢&#xff0c;具体原因如下所示 磁盘IO成本增加&#xff1a;页块是数据库中数据的基本存储单位&#xff0c;通常一个页块的大小为16KB。如果查询的数据分布在不同的页块上&#xff0c;数据库需要进行…

MongoDB Long 类型 shell 查询

场景 1、某数据ID为Long类型&#xff0c;JAVA 定义实体类 Id Long id 2、查询数据库&#xff0c;此数据存在 3、使用 shell 查询&#xff0c;查不到数据 4、JAVA代码查询Query.query 不受任何影响 分析 尝试解决&#xff08;一&#xff09; long 在 mongo中为 int64 类型…

【android12-linux-5.1】【ST芯片】HAL移植后没调起来

ST传感器芯片HAL按官方文档移植后&#xff0c;测试一直掉不起来&#xff0c;加的日志没出来。经过分析&#xff0c;是系统自带了一个HAL&#xff0c;影响的。 按照官方文档&#xff0c;移植HAL后&#xff0c;在/device/<vendor\>/<board\>/device.mk*路径增加PROD…

英语常用的介词

一、常用介词 介词&#xff08;Preposition&#xff09;是英语语法中的一类词语&#xff0c;用于连接名词、代词或名词性短语与其他词语&#xff0c;以指示位置、方向、时间、关系等概念。介词的最原始含义通常与空间、时间、方向或关系有关。以下是一些常见的介词及其最原始的…

运维高级学习--Kubernetes(K8s 1.28.x)部署

一、基础环境配置&#xff08;所有主机操作&#xff09; 主机名规划 序号 主机ip 主机名规划1 192.168.1.30 kubernetes-master.openlab.cn kubernetes-master2 192.168.1.31 kubernetes-node1.openlab.cn kubernetes-node13 192.168.1.32 kubernetes-node2…

从零开始的Hadoop学习(二)| Hadoop介绍、优势、组成、HDFS架构

1. Hadoop 是什么 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。主要解决&#xff0c;海量数据的存储和海量数据的分析计算问题。广义上来说&#xff0c;Hadoop通常是指一个更广泛的概念—Hadoop生态圈。 2. Hadoop 的优势 高可靠性&#xff1a;Hadoop底层维护多…

基于Centos搭建k8s仓库

系统环境&#xff1a; Red Hat Enterprise Linux 9.1 (Plow) Kernel: Linux 5.14.0-162.6.1.el9_1.x86_64 主机名地址master192.168.19.128node01192.168.19.129node02192.168.19.130 目录 1、关闭防火墙&#xff0c;关闭SElinxu &#xff0c;开启时间同步服务 2、关…

动态表情包怎么制作?分享一个一键生成gif动图的方法

跟朋友聊天时&#xff0c;经常会用很多有趣的表情包给朋友回复&#xff0c;那么除了利用系统提供的gif动画包&#xff0c;怎么才能完成gif图片制作&#xff08;https://www.gif.cn&#xff09;呢&#xff1f;下面就为大家分享一个一键生成gif动图的方法&#xff0c;通过简单的操…

React 18 用 State 响应输入

参考文章 用 State 响应输入 React 控制 UI 的方式是声明式的。不必直接控制 UI 的各个部分&#xff0c;只需要声明组件可以处于的不同状态&#xff0c;并根据用户的输入在它们之间切换。这与设计师对 UI 的思考方式很相似。 声明式 UI 与命令式 UI 的比较 当设计 UI 交互时…

Python爬虫猿人学逆向系列——第六题

题目&#xff1a;采集全部5页的彩票数据&#xff0c;计算全部中奖的总金额&#xff08;包含一、二、三等奖&#xff09; 地址&#xff1a;https://match.yuanrenxue.cn/match/6 本题比较简单&#xff0c;只是容易踩坑。话不多说请看分析。 两个参数&#xff0c;一个m一个f&…

软考高级系统架构设计师系列之:论文典型试题写作要点和写作素材总结系列文章四

软考高级系统架构设计师系列之:论文典型试题写作要点和写作素材总结系列文章四 一、论软件的静态演化和动态演化及其应用1.论文题目2.写作要点和写作素材二、论大规模分布式系统缓存设计策略1.论文题目2.写作要点和写作素材三、论基于REST服务的Web应用系统设计1.论文题目2.写…

SpringBoot原理

一、Bean原理 1、配置文件的优先级 SpringBoot项目当中支持的三类配置文件&#xff1a; ​ - application.properties - application.yml - application.yaml 配置文件优先级排名&#xff08;从高到低&#xff09;&#xff1a; 1. properties配置文件 2. yml配置文件 3. yaml…

【PHP】PHP变量

1、变量介绍 PHP 是一门弱类型语言&#xff0c;不必向 PHP 声明该变量的数据类型。PHP 会根据变量的值&#xff0c;自动把变量转换为正确的数据类型。在强类型的编程语言中&#xff0c;必须在使用变量前先声明&#xff08;定义&#xff09;变量的类型和名称。 <?php $x5;…

代码随想录算法训练营day46 | LeetCode 139. 单词拆分

139. 单词拆分&#xff08;题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台&#xff09; 思路&#xff1a;又是一种不同形式的背包问题&#xff0c;求一个字符串是否能由字符串数组中的若干字符排列组成。首相想到排列&#xff0…