Luogu P9236 [蓝桥杯 2023 省 A] 异或和之和

news/2025/2/12 8:34:35/文章来源:https://www.cnblogs.com/w9095/p/18710873

P9236 [蓝桥杯 2023 省 A] 异或和之和

首先,异或有一个重要的性质:

\[a\oplus b \oplus b=a \]

因为 \(b\) 的二进制位一定与自己一样,根据异或的定义,得出 \(b\oplus b=0\),进而推出这个式子。

有了这个式子,区间异或和就可以像前缀和一样处理了。

我们可以求出每一项的前缀异或和,记作 \(q_i\),根据上面那条性质,可以仿照前缀和的形式写出区间 \([l,r]\) 的异或和(记作 \(S_{l,r}\))的 \(O(1)\) 求法式子:(下标均从 \(1\) 开始)

\[S_{l,r}=p_r\oplus p_{l-1} \]

所以,我们用这个式子来求解每个区间的异或和,可以把每个子段的异或和的和转变为下面式子:(这里 \(p_0\) 默认取 \(0\) 值,因为还需要查询类似 \([1,i]\) 这种区间的值)

\[\sum_{i=1}^{n}\sum_{j=0}^{i-1}p_i\oplus p_j \]

但这个做法的复杂度是 \(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\) 个二进制位)

\[\sum_{i=0}^{20}w_{i,0}\times w_{i,1}\times 2^i \]

时间复杂度 \(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;
}

AC记录

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

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

相关文章

VMware NSX Advanced Load Balancer (NSX ALB) 30.1.2 - 多云负载均衡平台

VMware NSX Advanced Load Balancer (NSX ALB) 30.1.2 - 多云负载均衡平台VMware NSX Advanced Load Balancer (NSX ALB) 30.1.2 - 多云负载均衡平台 应用交付:多云负载均衡、Web 应用防火墙和容器 Ingress 服务 请访问原文链接:https://sysin.org/blog/vmware-nsx-alb-30/ 查…

Symantec Endpoint Protection 14.3 RU10 v14.3.12154.10000 下载

Symantec Endpoint Protection 14.3 RU10 v14.3.12154.10000 下载Symantec Endpoint Protection 14.3 RU10 v14.3.12154.10000 下载 Broadcom | SEP | SEPM | 简体中文版 | 繁体中文版 | 英文版 请访问原文链接:https://sysin.org/blog/sep-14/ 查看最新版。原创作品,转载请保…

动态编译一个新的 NativeApi 类

要动态编译一个新的 NativeApi 类,可以按照以下步骤进行:创建一个新的 NativeApi 类。 在 NativeApi 类中定义所需的方法和属性。 在 MainPage 中实例化并使用新的 NativeApi 类。using MauiPlus; using System.Reflection.Emit; using System.Reflection;namespace MauiPlus…

2025年的10个营销关键词

在瞬息万变的营销领域,把握趋势是成功的关键。本文总结了 2025 年的 10 个营销关键词,帮助你在 2025 年的营销战场上脱颖而出。 关键词一:需求细分 产品是营销的前提,产品的价值和人群越精准越细分,越容易爆。不要再喊大而泛的口号。 比如,母婴品牌世喜设计了一款“防胀气…

2025 开工大吉:明确绩效目标,合理安排计划

随着春节假期的结束,我们迎来了新的一年,也迎来了充满希望与挑战的开工日。在这个全新的起点上,“开工大吉”不仅是一句美好的祝愿,更是对我们每一位员工工作态度与效率的期许。为了在新的一年里实现更大的突破与发展,我们需要有一个明确的目标导向和高效的工作计划。在这…

容器附加存储CAS之OpenEBS快速入门

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.CAS之OpenEBS存储机制概述1.什么是CAS2.什么是OpenEBS3.OpenEBS数据引擎4.NDM(Node Disk Manager)5.部署OpenEBS的基本流程二.部署OpenEBS 一.CAS之OpenEBS存储机制概述 1.什么是CAS Kubernetes的卷…

【CodeForces训练记录】Codeforces Round 1004 (Div. 2)

训练情况赛后反思 这场太神奇了,都在和出题人对脑电波,全是智慧题 A题 我们考虑进位的情况,例如 9999 之类的,我们发现进位对答案的影响只有 \(x - 9k + 1 = y\),判断 \(k\) 是否存在非负整数解即可点击查看代码 #include <bits/stdc++.h> // #define int long long…

短信验证码爆破

漏洞原理 短信验证码验证时间和次数无限制,存在爆破可能 短信验证码有效期:5~10min,验证码位数4位或6位,纯数字 破解方式:使用枚举逐个尝试 使用BP爆破短信验证码可以先用已有手机号确认验证码位数2.发送验证码后将验证码输入,然后登陆抓包后续和爆破操作一致如果字典太大…

【洛谷P1955】程序自动分析[NOI2015]

今天开始学习并查集 什么是并查集呢?顾名思义,就是动态维护一个方便进行合并和查找的集合 我们采用的是树状结构 也就是说,对于一开始的每个元素 它的爸爸是它自己 然后在输入两个元素的从属关系的时候,通过路径压缩,把它的爸爸直接连到根节点 因为我们只关心这个元素在这…

chorme 系统代理设置

https 需要证书 1.使用BurpSuite导出CA证书,文件导出到本地2. 谷歌浏览器添加证书 谷歌浏览器->设置->搜索"证书"->安全->管理证书->管理从windows导入的证书->受信任的根证书颁发机构->导入第一步的证书3.设置系统代理 windows系统->设置-…

picachu 越权漏洞

1. 水平越权 1.查看提示信息,提供了3个普通用户2. 登陆其中一个账户,并查看个人信息3.根据url 可以看出有用户名信息,尝试在URL中更改其他账户名,发现查看到其他用户的信息4.再次点击查看个人信息按钮,信息更改为已登陆的用户的信息5. 查看源代码发现第27行username 的值是…

windows使用Makefile时自动给可执行文件加上.exe后缀

APP := main在使用makefile的时候,一般通过变量设置自己想要编译出来的可执行文件的名字在windows平台编译出来的可执行文件是需要.exe后缀的识别当前操作系统 通过识别当前的操作系统是什么,从而确定是否添加这个后缀在windows系统中,有这个环境变量说明自己的系统是windows而…