Luogu P9236 [蓝桥杯 2023 省 A] 异或和之和 题解
首先,异或有一个重要的性质:
\]
因为 \(b\) 的二进制位一定与自己一样,根据异或的定义,得出 \(b\oplus b=0\),进而推出这个式子。
有了这个式子,区间异或和就可以像前缀和一样处理了。
我们可以求出每一项的前缀异或和,记作 \(q_i\),根据上面那条性质,可以仿照前缀和的形式写出区间 \([l,r]\) 的异或和(记作 \(S_{l,r}\))的 \(O(1)\) 求法式子:(下标均从 \(1\) 开始)
\]
所以,我们用这个式子来求解每个区间的异或和,可以把每个子段的异或和的和转变为下面式子:(这里 \(p_0\) 默认取 \(0\) 值,因为还需要查询类似 \([1,i]\) 这种区间的值)
\]
但这个做法的复杂度是 \(O(n^2)\),不够通过本题的数据范围,所以我们还需要在这个基础上继续优化。
在这个式子中,我们可以观察到,对于每一对 \(i,j\) 不相等的有序数对 \((i,j)\),\(p_i,p_j\) 都恰好只互相异或了一次。所以,问题又转化为了 \(n\) 个数,其中两两异或的求和。
这个时候会发现推式子已经到达尽头了,再怎么推也不会得到新的结论。必须从其他方面考虑问题,比如异或运算的计算原理的方面。可以考虑把每个数按二进制拆分,在每一位上统计该位的贡献。由于最后是两两异或的求和,所以二进制拆分后打乱不会影响结果。
由于异或的运算法则是如果同位数字不同,那么运算结果的这一位为 \(1\)。我们知道,只有二进制位为 \(1\) 对最终的结果(加和)有贡献,所以我们可以统计二进制结果为 \(1\) 的情况。
对于每一个 \(p_i\),我们将其按位拆分,并将结果存入计数数组 \(w_{i,j}\) 中。其中 \(i\) 表示第 \(i\) 个二进制位,\(j\) 表示这一位上为 \(j\)(只能为 \(0\) 或 \(1\)),\(w_{i,j}\) 表示在所有数中,第 \(i\) 个二进制位上为 \(j\) 的有 \(w_{i,j}\) 个。
由于这些数中必定两两异或,所以可以直接用乘法原理,求出该位最终为 \(1\) 的个数,最后乘上该位的权值就可以了。所以最后的答案为:(公式中 \(i\) 的范围上界到 \(20\) 是因为题目中说 \(A_i\le2^{20}\),最多只有 \(21\) 个二进制位)
\]
时间复杂度 \(O(n)\),可以通过本题。
#include <bits/stdc++.h>
using namespace std;
long long n,a[100010],q[100010],w[100010][2],ans=0;
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
for(int i=1;i<=n;i++)q[i]=q[i-1]^a[i];
for(int i=0;i<=n;i++)
for(int j=20;j>=0;j--)
w[j][(q[i]>>j)&1]++;
for(int i=0;i<=20;i++)
ans+=w[i][0]*w[i][1]*(1<<i);
printf("%lld",ans);
return 0;
}
Luogu P9236 [蓝桥杯 2023 省 A] 异或和之和 题解的更多相关文章
- 2018年第九届蓝桥杯B组第四题:摔手机题解
摔手机 摔手机 动态规划 在蓝桥杯的时候遇到一次 当时没有做对 看了题解也没明白 如今再次遇到这个类似的题目 于是拿出来补补吧 摔手机题目如下: 星球的居民脾气不太好,但好在他们生气的时候唯一的 ...
- 第九届蓝桥杯省赛c/c++真题明码题解答案,另类excel解法思路
直到快比赛才重视起之前学校给报了蓝桥杯,且这段时间一直在做Python,所以没做什么准备. 赛场上做这道题时连反码补码的知识点都记混,所以直接用了excel做这道题目,分享下做题思路.及题解. 标题: ...
- 第十届蓝桥杯省赛JavaB组个人题解
前言 以下的第十届蓝桥杯Java B组省赛的题目题解只是我个人的题解,提供一些解题思路,仅作参考,如有错误,望大家指出,不甚感激,我会及时更改. 试题 A: 组队 ----- 答案:490 [问题描述 ...
- 日期求星期(java)-蓝桥杯
日期求星期问题(java)-蓝桥杯 1:基姆拉尔森计算公式(计算星期) 公式: int week = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; 此处y,m,d指代年 ...
- 算法笔记_199:第二届蓝桥杯软件类决赛真题(C语言本科)
前言:以下代码部分仅供参考,C语言解答部分全部来自网友,Java语言部分部分参考自网友,对于答案的正确性不能完全保证. 试题1 数论中有著名的四方定理:所有自然数至多只要用四个数的平方和就可以表示. ...
- 2018第九届蓝桥杯决赛(C++ B组)
逛了大半个北京还是挺好玩de 第一题 标题:换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种. 小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱. ...
- 2016年蓝桥杯B组C/C++决赛题目
2016年第七届蓝桥杯B组C/C++决赛题目 点击查看2016年第七届蓝桥杯B组C/C++决赛题解 1.一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里. 矿车停在平直的废弃的轨道上. 他的 ...
- 2012年 蓝桥杯预赛 java 本科 题目
2012年 蓝桥杯预赛 java 本科 考生须知: l 考试时间为4小时. l 参赛选手切勿修改机器自动生成的[考生文件夹]的名称或删除任何自动生成的文件或目录,否则会干扰考试系统正确采集您的解答 ...
- 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索
问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...
- 蓝桥杯---数独(模拟 || dfs)
[编程题](满分33分) "数独"是当下炙手可热的智力游戏.一般认为它的起源是"拉丁方块",是大数 学家欧拉于1783年发明的. 如图[1.jpg]所示:6x6 ...
随机推荐
- python,url请求失败重新请求的方法(try、except 应用)
爬虫请求链接,有时候会出现请求失败或者等待时间很长的情况,用下面的方法可以一定程度的解决这个问题 url='https://cl.xxxx.xyz/'+url try: response = requ ...
- 康谋分享 | aiSim5仿真场景重建感知置信度评估(三)
aiSim5重建高精度的真实交通场景,用于测试和训练ADAS/AD系统.内置场景包括赛道.车库.高速公路和城市环境.通过全局行动日志,aiSim能将驾驶数据转化为场景重建.车道线检测算法在仿真与现实世 ...
- ES6 Fielddata is disabled on text fields by default
使用ES做聚合运算的时候,有时候会遇到这个错误 Fielddata is disabled on text fields by default. Set fielddata=true on [host ...
- 36条技巧优化PHP代码(总结)
原文:38条技巧优化PHP代码 1.如果一个方法能被静态,那就声明他为静态的,速度可提高1/4; 2.echo的效率高于print,因为echo没有返回值,print返回一个整型; 3.在循环之前设置 ...
- OAuth 2.0——微信授权登录
一.参考链接: 理解OAuth 2.0 - 阮一峰的网络日志 (ruanyifeng.com) 使用微信授权登录: 参照:第三方平台使用微信登录流程 - 知乎 (zhihu.com) 基本概念介绍 | ...
- 操作系统综合题之“采用二级页表的分页存储管理方式,计算页目录号的位数 和 页大小,给定页目录项大小计算页目录表大小,给定逻辑地址计算页内偏移量和物理地址[0x00200643]”
一.问题:某计算机系统的主存按字节编址,逻辑地址和物理地址都是32位,其内存管理采用两级页表的分页存储管理方式.逻辑地址中页号位10位,页内偏移地址为10位.该计算机系统的两级页表结构如下图所示,图中 ...
- 端到端自动驾驶系统实战指南:从Comma.ai架构到PyTorch部署
引言:端到端自动驾驶的技术革命 在自动驾驶技术演进历程中,端到端(End-to-End)架构正引领新一轮技术革命.不同于传统分模块处理感知.规划.控制的方案,端到端系统通过深度神经网络直接建立传感器原 ...
- C++11 shared_ptr(智能指针)
在确保new动态分配的内存空间在使用结束之后,释放是一件麻烦事.C++11模板库的头文件中定义的智能指针,即shared_ptr模板,就是用来解决这个问题的. 它是将new运算符返回的指针p交给一个s ...
- WPF 基于Transform实现画布超出边界触发计算
有些场景需要对画布边界做界限控制,此时需要计算画布的四个方向的界限和极值 先看效果图: 画布在通过RenderTransform 做变换,由于在变换的过程中,实际的宽高没有改变,需要通过Transfo ...
- Java 自定义线程池的线程工厂
本文分享创建线程工厂 ThreadFactory 的三种方式,以方便大家快速创建线程池,并通过线程工厂给每个创建出来的线程设置极富业务含义的名字. 线程池大小考虑因素 由于需要自定义线程池,故 ...