题目链接:https://codeforces.com/contest/1323/problem/D

题意:给了大小为4e5的数组a,其中1<=ai<=1e7。求所有点对和的异或和,即:


思路:

  • 按位来考虑,因为两个元素的和<=2e7,而2e7小于225,因此结果最多是25位。我们考虑答案中每一位ans[k]的值(0<=k<=24)。
  • 显然,ai中仅有0~k位会对第k位有影响,因此对数组a全部对2k+1取模,得到数组b,对b按升序排序。
  • 这样,0<=bi<=2k+1-1,两个bi的和<=2k+2-2。要使得和的第k位为1,和的范围应该为[ 2k , 2k+1-1 ] (区间1)或者 [ 2k+2k+1 , 2k+2-2] (区间2)。
  • 枚举bi,对两个区间可分别得到另一个和bi相加的元素bj的范围大小,利用二分查找bj的区间,从而得到bj的个数num。枚举完之后num%2=1的话,答案中的第k位便是1。
  • 另外,如果bi<=2k,那么bi和另一个元素的和只可能在区间1内,否则既可以在区间1,也可以在区间2。

AC code:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int maxn=4e5+5;
typedef long long LL;
int n,a[maxn],b[maxn],p[30],ans,MOD; void init(){
p[0]=1;
for(int i=1;i<=26;++i)
p[i]=p[i-1]<<1;
} int bs1(int ll,int rr,int v){
int l=ll,r=rr,mid;
while(l<=r){
mid=(l+r)>>1;
if(b[mid]>=v) r=mid-1;
else l=mid+1;
}
return l;
} int bs2(int ll,int rr,int v){
int l=ll,r=rr,mid;
while(l<=r){
mid=(l+r)>>1;
if(b[mid]<=v) l=mid+1;
else r=mid-1;
}
return r;
} int main(){
init();
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
for(int k=0;k<=24;++k){
LL num=0;
MOD=p[k+1];
for(int i=1;i<=n;++i)
b[i]=a[i]%MOD;
sort(b+1,b+n+1);
for(int i=1;i<n;++i){
int le=max(p[k]-b[i],0),ri=p[k+1]-1-b[i];
int l=bs1(i+1,n,le);
int r=bs2(i+1,n,ri);
num+=(LL)(r-l+1);
if(b[i]<=p[k]) continue;
le=p[k+1]+p[k]-b[i],ri=p[k+2]-2-b[i];
l=bs1(i+1,n,le);
r=bs2(i+1,n,ri);
num+=(LL)(r-l+1);
}
if((int)(num%2)==1) ans+=p[k];
}
printf("%d\n",ans);
return 0;
}

Codeforces Round #626 Div2 D. Present(位掩码,二分)的更多相关文章

  1. Codeforces Round #626 Div2 D,E

    比赛链接: Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics) D.Present 题意: 给定大 ...

  2. 【前行】◇第3站◇ Codeforces Round #512 Div2

    [第3站]Codeforces Round #512 Div2 第三题莫名卡半天……一堆细节没处理,改一个发现还有一个……然后就炸了,罚了一啪啦时间 Rating又掉了……但是没什么,比上一次好多了: ...

  3. Codeforces Round #539 div2

    Codeforces Round #539 div2 abstract I 离散化三连 sort(pos.begin(), pos.end()); pos.erase(unique(pos.begin ...

  4. Codeforces Round#320 Div2 解题报告

    Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Fin ...

  5. Codeforces Round #564(div2)

    Codeforces Round #564(div2) 本来以为是送分场,结果成了送命场. 菜是原罪 A SB题,上来读不懂题就交WA了一发,代码就不粘了 B 简单构造 很明显,\(n*n\)的矩阵可 ...

  6. Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics)

    A. Even Subset Sum Problem 题意 给出一串数,找到其中的一些数使得他们的和为偶数 题解 水题,找到一个偶数或者两个奇数就好了 代码 #include<iostream& ...

  7. Codeforces Round #361 div2

    ProblemA(Codeforces Round 689A): 题意: 给一个手势, 问这个手势是否是唯一. 思路: 暴力, 模拟将这个手势上下左右移动一次看是否还在键盘上即可. 代码: #incl ...

  8. Codeforces Round #626 (Div. 2) D. Present(位运算)

    题意: 求n个数中两两和的异或. 思路: 逐位考虑,第k位只需考虑0~k-1位,可通过&(2k+1-1)得到一组新数. 将新数排序,当两数和在[2k,2k+1)和[2k+1+2k,2k+2)之 ...

  9. Codeforces Round #626 D. Present

    D. Present 题目大意:给你一个大小是n的序列,求两两之间相加进行异或之后的答案. 这个题目我并没有想到怎么写,有点偷懒于是就去看了题解.. 题解很套路... 题解: 因为这个是用到了异或,所 ...

随机推荐

  1. PHP SDK短信接口

    /** * sdk 短信接口 * @param $tel 手机号 * @param $content 短信内容 * @return bool */ public function telSDK($te ...

  2. 【Java基础】反射

    反射 反射的概述 反射(Reflection)是被视为动态语言的关键,反射机制允许程序在执行期借助 Reflection API 取得任何类的内部信息,并能直接操作任意对象的内部属性和方法. 加载完类 ...

  3. 剑指offer 面试题2:实现Singleton模式

    转自:https://blog.csdn.net/liang19890820/article/details/61615495 Singleton 的头文件(懒汉式/饿汉式公用): // single ...

  4. Python模块化编程与装饰器

    Python的模块化编程 我们首先以一个例子来介绍模块化编程的应用场景,有这样一个名为requirements.py的python3文件,其中两个函数的作用是分别以不同的顺序来打印一个字符串: # r ...

  5. 使用msys2在window下构建和使用Linux的软件

    目录 前言 安装 使用 总结 前言 在window下构建Linux编译环境是很常见的,以前用过mingw弄过差不多的环境. 但是使用msys2后就根本停不下来咯,太好用咯. 安装 去官网下载吧,安装跟 ...

  6. Java并发/多线程-CAS原理分析

    目录 什么是CAS 并发安全问题 举一个典型的例子i++ 如何解决? 底层原理 CAS需要注意的问题 使用限制 ABA 问题 概念 解决方案 高竞争下的开销问题 什么是CAS CAS 即 compar ...

  7. MCU的心脏-晶振

    晶振是石英晶体谐振器(quartzcrystal oscillator)的简称,它被称为电路系统的心脏,它为整个系统提供"心跳".中央处理器(CPU)一切指令的执行都是建立在这个& ...

  8. elasticsearch-head:5连接elasticsearch 6.x无法显示浏览数据的解决方案

    问题 在docker安装了elasticsearch-head:5和elasticsearch:6.3.2 打开界面连接es时发现数据无法展示. 解决方案 因docker使用的版本问题,可能名称略有变 ...

  9. QTextEdit的paste

    By 鬼猫猫 20130117 http://www.cnblogs.com/muyr/ 背景 QTextEdit中粘贴一大段文字时,EasyDraft中粘贴进去的文字们的格式就乱了,处于无格式.还有 ...

  10. uni-app通过canvas实现手写签名

    分享一个uni-app实现手写签名的方法 具体代码如下: <template> <view > <view class="title">请在下面 ...