ABC365E Xor Sigma Problem 题解
ABC365E Xor Sigma Problem 题解
题目大意#
给定长度为 的序列 ,求 。
Solve#
看到异或不难想到按位枚举,按位枚举时维护什么信息呢?
考虑对于序列 ,我们倒序枚举,那么在加入 之前得到的区间异或和之和形如:
加入 后,这个表达式的每个括号里都要异或上 。那么从结果上看,若 的第 位是 ,则异或和的第 位就要反转。
故我们考虑维护如下信息:对于第 位, 表示有多少段异或和(上式中每一个括号内的值)这一位是 , 表示有多少段异或和这一位是 。统计答案时直接加上 即可。
加入 后,按位扫一遍,如果 第 位是 ,就交换 和 。同时别忘了,加入 时多了一段 ,故我们还要让 加上 方便后面统计答案。
Code#
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read()
{
short f=1;
int x=0;
char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
const int N=2e5+10;
int n,a[N],ans,cnt[35][2];
signed main()
{
n=read();
for(int i=1;i<=n;i=-~i) a[i]=read();
for(int i=n;i;i--)
{
for(int j=30;j>=0;j--)
ans+=cnt[j][(a[i]>>j&1)^1]*(1<<j);
for(int j=30;j>=0;j--)
{
if(a[i]>>j&1) swap(cnt[j][1],cnt[j][0]);
cnt[j][a[i]>>j&1]++;
}
}
return printf("%lld",ans),0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探