【洛谷】P9236 [蓝桥杯 2023 省 A] 异或和之和

题目链接

P9236 [蓝桥杯 2023 省 A] 异或和之和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)



思路

1. 暴力求解

直接枚举出所有子数组,求每个子数组的异或和,再对所有的异或和求和

枚举所有子数组的时间复杂度为O(N^2),求每个子数组的异或和又要遍历一次数组,所以总的时间复杂度为O(N^3)

2. 优化

异或中有这么一个性质:a ^ b ^ b = a,即两个相同元素异或后为0,此性质推广到子数组同理

因此我们可以用前缀和的思想来快速得出一个区间的异或和。

此时可以将时间复杂度优化为O(N^2)

基于前缀和,我们进行进一步的优化:拆位法和贡献法

(1)拆位法

拆位法:将一个数转换成二进制形式,并拆分成单独的二进制位来计算

二进制中除了0就是1,由于异或的性质,我们可以得出一个结论:对于二进制位中的第i位而言,如果这一位中1的个数为奇数,那么异或后的结果中这一位就是1,否则为0

例如:

拆位法加上前缀和,我们就能计算出某个区间中这一位上1的个数,进而得出在该区间中这个二进制位异或后是0还是1

(2)贡献法

贡献法:从区间的角度转换成计算每个二进制位对答案的贡献

某个区间中,这一位异或后的结果为1时,这一位就产生了贡献;异或后的结果为0时这一位就不会产生贡献。

例如:

我们以一个二进制位作为一个计算周期,统计该位中1的前缀和

例如该位中1的前缀和为偶数,说明对于虚线内的这个区间,异或后该位为0,无贡献

注意:这里的区间最终异或后只可能为1或0,因此当我们谈论区间的贡献时,实际上也就是谈论该位是否有贡献 

但是如果一个前缀和为偶数的区间减去一个前缀和为奇数的区间,所得到的新的区间的前缀和也为奇数,即新区间中该位异或后的结果为1,有贡献

例如:

蓝色虚线的区间前缀和为偶数(2),减去红色虚线前缀和为奇数(1)的区间,所得到蓝色实线区间的1的前缀和为奇数(2 - 1 = 1),则该实线区间异或后也有贡献

通过观察,我们可以得出以下结论:

对于第i个二进制位,如果以第n个数为结尾的区间所对的前缀和为偶数时,该区间能够提供 前面奇数前缀和的个数 个贡献区间

例如对于上面蓝色虚线的区间,其前面有一个奇数前缀和,那么该区间自身就能提供一个贡献区间

而该位中1的前缀和为奇数,与上面同理,我们只需要计算出前面所有前缀和为偶数的区间个数,减去这些前缀和为偶数的区间得到的新区间,前缀和都为奇数(奇-偶=奇),则都有贡献

而因为该区间本身的前缀和为奇数,所以能够提供的贡献区间为:1 + 前面偶数前缀和的个数

通过提示我们可以知道所有的数中有效位数不会超过20


代码

#include <bits/stdc++.h>
using namespace std;
#define ll long longll n;int main()
{cin >> n;ll *arr = new ll[n];for (int i = 0; i < n; i++)cin >> arr[i];ll pow = 1, sum = 0;  for (int i = 0; i < 20; i++) //最多计算20个二进制位 {ll counti = 0, oddnum = 0, evenum = 0, range = 0; //counti统计1的前缀和,oddnum统计奇数前缀和的个数//evenum统计偶数前缀和的个数,range统计有贡献区间个数 for (int j = 0; j < n; j++) //遍历n个整数 {if (arr[j] & 1) //按位与1后结果为1,说明最低位为1,否则为0 counti++; //更新前缀和 if (counti % 2 == 1) //前缀和为奇数{range += 1 + evenum; //更新有贡献区间个数 oddnum++; //奇数前缀和的个数+1 }else //前缀和为偶数 {range += oddnum; //更新有贡献区间个数 evenum++; //偶数前缀和的个数+1 }arr[j] >>= 1; //移位 }sum += range * pow; //计算位数对结果的贡献值 pow *= 2; //更新pow }cout << sum;return 0;
}

讲的不够清楚也请大家多多见谅,有错误或问题可以在评论区指出。

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

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

相关文章

(学习日记)2024.04.10:UCOSIII第三十八节:事件实验

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

6.1Python之字典的初识

【1】字典的创建与价值 字典&#xff08;Dictionary&#xff09;是一种在Python中用于存储和组织数据的数据结构。元素由键和对应的值组成。其中&#xff0c;键&#xff08;Key&#xff09;必须是唯一的&#xff0c;而值&#xff08;Value&#xff09;则可以是任意类型的数据。…

性能测试干2年,还不会这个技术点?!

nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具&#xff0c;记录的信息比较全面&#xff0c;结合nmon_analyzer工具产生数据文件与图形化结果。 nmon可监控的数据类型 内存使用情况、磁盘适配器、文件系统中的可用空间、CPU使用率等等数据信息 特点 ①占用…

urwid,一个好用的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个好用的 Python 库 - urwid。 Github地址&#xff1a;https://github.com/urwid/urwid Urwid 是一个功能强大的 Python 库&#xff0c;用于创建基于文本的用户界面&#xf…

稀碎从零算法笔记Day45-LeetCode:电话号码的字母组合

题型&#xff1a;映射、回溯算法、递归 链接&#xff1a;17. 电话号码的字母组合 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出…

vue vue3 手写 动态加载组件

效果展示 一、需求背景&#xff1a; # vue3 项目涉及很多图表加载、表格加载 #考虑手写一个动态加载组件 二、实现思路 通过一个加载状态变量&#xff0c;通过v-if判断&#xff0c;加载状态的变量等于哪一个&#xff0c;动态加载组件内部就显示的哪一块组件。 三、实现效果…

雄安建博会:中矿雄安新区的总部开工建设

中矿落位雄安&#xff1a;助力国家战略与新区发展 雄安新区&#xff0c;作为中国未来发展的重要战略支点&#xff0c;正迎来一系列央企总部的疏解与建设。最近&#xff0c;中国矿产资源集团有限公司&#xff08;简称“中矿”&#xff09;在雄安新区的总部项目正式开工建设&…

防止U盘拷贝复制的软件和方法

防止U盘拷贝复制的软件和方法 防止U盘拷贝的软件旨在限制未经授权的用户从U盘中复制、移动、打印或以其他方式传播存储在其上的文件。 以下是一些具体的防U盘拷贝软件及其特点&#xff1a; 1、安企神软件 提供专业的U盘加密保护&#xff0c;可将普通U盘制作成防拷贝U盘&…

单链表专题

文章目录 目录1. 链表的概念及结构2. 实现单链表2.1 链表的打印2.2 链表的尾插2.3 链表的头插2.4 链表的尾删2.5 链表的头删2.6 查找2.7 在指定位置之前插入数据2.8 在指定位置之后插入数据2.9 删除pos节点2.10 删除pos之后的节点2.11 销毁链表 3. 链表的分类 目录 链表的概念…

蓝桥 python笔记15——矩阵运算、基础数论、GCD和LCM、质数、唯一分解定理、快速幂

目录 矩阵运算 基础数论 GCD和LCM 质数 唯一分解定理 快速幂 矩阵运算 矩阵加减法&#xff1a; 矩阵和数相乘&#xff1a; 矩阵转置&#xff1a; 矩阵乘法&#xff1a; # 矩阵乘法 def mul(A,B):N,Mlen(A),len(A[0])#行数&#xff0c;列数_M,Klen(B),len(B[0])if M!_M:re…

语音情感识别调研

语音情感识别调研 1、情绪识别综述2、语音情感识别算法3、语音特征提取4、相关项目1、用 LSTM、CNN、SVM、MLP 进行语音情感识别2、DST&#xff1a;基于Transformer的可变形语音情感识别模型3、语音情感基座模型emotion2vec4、IEEE ICME 2023论文&#xff5c;基于交互式注意力的…

【PyQt5篇】使用QtDesigner添加控件和槽

文章目录 &#x1f354;使用QtDesigner进行设计&#x1f6f8;在代码中添加信号和槽 &#x1f354;使用QtDesigner进行设计 我们首先使用QtDesigner设计界面 得到代码login.ui <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0&q…

穿越代码之海:探寻结构体深层逻辑,展望未来应用新天地

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 结构体作为一种数据结构&#xff0c;其定义和特点决定了它在各种应用中的广泛适用性。随着科技的进步和新兴行业的不断涌现&#xf…

C++——IO流

目录 一&#xff0c;C语言的输入与输出 二&#xff0c;流是什么 三&#xff0c;C标准IO流 3.1 四个全局流对象 3.2 OJ题中的输入和输出 3.3 自定义类型重载输入和输出 四&#xff0c;C文件IO流 4.1 C文件操作步骤 4.1.1 操作文件的类 4.1.2 文件打开方式 4.1.3 文件操…

【数据下载】SODA数据更新至2022并教学下载

【数据下载】SODA数据更新至2022并教学下载 我为什么那么喜欢使用SODA数据&#xff1f; 就是三维网格化的数据&#xff0c;好用。 但是需要高分辨率还是需要找别的。 以前分享过SODA数据下载&#xff0c;但上次版本过于凌乱。因此重新借助更新再分享一次&#xff0c;不为过。…

前端mock数据——使用mockjs进行mock数据

前端mock数据——使用mockjs进行mock数据 一、安装二、mockjs的具体使用 一、安装 首选需要有nodejs环境安装mockjs&#xff1a;npm install mockjs 若出现像上图这样的错&#xff0c;则只需npm install mockjs --legacy-peer-deps即可 src下新建mock文件夹&#xff1a; mo…

Python | 超前滞后分析

Nino SST Indices (Nino 12, 3, 3.4, 4; ONI and TNI) 有几个指标用于监测热带太平洋&#xff0c;所有这些指标都是基于海表温度(SST)异常在一个给定的区域的平均值。通常&#xff0c;异常是相对于30年的周期来计算的。厄尔尼诺3.4指数(Nio 3.4 index)和海洋厄尔尼诺指数(Ocea…

【JavaWeb】Day39.MySQL概述——数据库设计-DQL(二)

数据库设计-DQL 聚合函数 聚合函数查询就是纵向查询&#xff0c;它是对一列的值进行计算&#xff0c;然后返回一个结果值。&#xff08;将一列数据作为一个整体&#xff0c;进行纵向计算&#xff09; 语法&#xff1a; select 聚合函数(字段列表) from 表名 ; 注意 : 聚合…

C++的stack和queue类(一):适配器模式、双端队列与优先级队列

目录 基本概念 stack的使用 queue的使用 适配器模式 stack.h test.cpp 双端队列-deque 仿函数 优先队列 priority_queue的使用 queue.h文件 stack.h文件 test.cpp文件 日期类的比较 商品的比较 结论 基本概念 1、stack和queue不是容器而是容器适配器&…

unable to find a medium containing a live file system解决办法!

背景&#xff1a; 用Ventoy制作U盘系统安装盘&#xff0c;只需要把ISO镜像拷进去就可以&#xff0c;可以放多少个镜像取决于U盘的大小&#xff0c;无需重复制作。Ventoy 将U盘的第一个分区默认格式化为exFAT文件系统来存放ISO文件。 但是&#xff0c;今天鲲鹏920平台安装银河…