正题

题目链接:https://www.luogu.com.cn/problem/CF1322B


题目大意

给出\(n\)个数字\(a_i\)求

\[\bigoplus _{i=1}^n\bigoplus _{j=i+1}^n(a_i+a_j)
\]

\(1\leq n\leq 4\times 10^5,1\leq a_i\leq 10^7\)


解题思路

分位考虑的话,先把每个位置更高位的给去掉,此时两个数字和这位为\(1\)的情况当且仅当他们的和在\([2^k,2^{k+1})\)或者\([2^{k+1}+2^k,2^{k+2})\)这两个区间。

双指针扫两次就好了。

时间复杂度\(O(n\log a_i)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=4e5+10;
ll n,a[N],b[N],sum;
signed main()
{
scanf("%lld",&n);
for(ll i=1;i<=n;i++)
scanf("%lld",&b[i]);
for(ll k=0;k<25;k++){
ll l=1,r=0,ans=0;
for(ll i=1;i<=n;i++)
a[i]=b[i]&((1ll<<k+1)-1);
sort(a+1,a+1+n);
for(ll i=n;i>=1;i--){
ll L=(1ll<<k)-a[i],R=(1ll<<k+1)-a[i];
while(r<n&&a[r+1]<R)r++;
while(l<=n&&a[l]<L)l++;
if(l>=i)break;
ans+=min(r,i-1)-l+1;
}
l=1,r=0;
for(ll i=n;i>=1;i--){
ll L=(1ll<<k+1)+(1ll<<k)-a[i],R=(1ll<<k+2)-a[i];
while(r<n&&a[r+1]<R)r++;
while(l<=n&&a[l]<L)l++;
if(l>=i)break;
ans+=min(r,i-1)-l+1;
}
sum+=(ans&1)*(1ll<<k);
}
printf("%lld\n",sum);
return 0;
}

最新文章

  1. SpringMVC视图解析器
  2. 在C#项目中需要用double类型操作MSSQL float类型数据(附C#数据类型和SQL数据类型对照)
  3. json-lib——JsonConfig详细使用说明
  4. C#编程:SqlCommand.Parameters.Add()方法的参数问题。
  5. Java在Web开发语言上败给了PHP
  6. co + Generator 写的迭代器 类似 async.whilst
  7. {$ecs_css_path}
  8. [转]开源那些事儿(四)-如何使用CodePlex进行项目管理
  9. 学习计划(一)——JavaScript
  10. 深入剖析Tomcat会话机制
  11. PMP知识点(五)——资源管理表示方法
  12. Struts2【UI标签、数据回显、资源国际化】
  13. Jackson Annotation Examples
  14. 开始转变方向,学习Linux——《Linux就该这么学》
  15. &lt;数据结构与算法分析&gt;读书笔记--数学知识复习
  16. JSON转化
  17. Unity3D初学之2D动画制
  18. Jquery UI Custom的兼容问题
  19. Sofware-Engineering Zero
  20. 12th final 发布评价II

热门文章

  1. Node + Selenium 报错 UnhandledPromiseRejectionWarning: Error: ECONNREFUSED connect ECONNREFUSED 127.0.0.1:5319
  2. IOC--框架进阶
  3. C++ 中的信号的处理
  4. SpringBoot2.0 防止XSS攻击
  5. maven下载出错
  6. pip 源的问题
  7. 【CSS】拼图验证练习
  8. Kafka内外网访问
  9. 根据短链生成二维码并上传七牛云(Java)
  10. MySQL——MySQL初始化配置文件