CF1322B-Present【双指针】
2024-10-01 09:57:24
正题
题目链接: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;
}
最新文章
- SpringMVC视图解析器
- 在C#项目中需要用double类型操作MSSQL float类型数据(附C#数据类型和SQL数据类型对照)
- json-lib——JsonConfig详细使用说明
- C#编程:SqlCommand.Parameters.Add()方法的参数问题。
- Java在Web开发语言上败给了PHP
- co + Generator 写的迭代器 类似 async.whilst
- {$ecs_css_path}
- [转]开源那些事儿(四)-如何使用CodePlex进行项目管理
- 学习计划(一)——JavaScript
- 深入剖析Tomcat会话机制
- PMP知识点(五)——资源管理表示方法
- Struts2【UI标签、数据回显、资源国际化】
- Jackson Annotation Examples
- 开始转变方向,学习Linux——《Linux就该这么学》
- <;数据结构与算法分析>;读书笔记--数学知识复习
- JSON转化
- Unity3D初学之2D动画制
- Jquery UI Custom的兼容问题
- Sofware-Engineering Zero
- 12th final 发布评价II
热门文章
- Node + Selenium 报错 UnhandledPromiseRejectionWarning: Error: ECONNREFUSED connect ECONNREFUSED 127.0.0.1:5319
- IOC--框架进阶
- C++ 中的信号的处理
- SpringBoot2.0 防止XSS攻击
- maven下载出错
- pip 源的问题
- 【CSS】拼图验证练习
- Kafka内外网访问
- 根据短链生成二维码并上传七牛云(Java)
- MySQL——MySQL初始化配置文件