D. Present

题目大意:给你一个大小是n的序列,求两两之间相加进行异或之后的答案。

这个题目我并没有想到怎么写,有点偷懒于是就去看了题解。。

题解很套路。。。

题解:

因为这个是用到了异或,所以不可避免的肯定要用到二进制。

所以考虑进行拆位,当我要考虑第 \(i\) 位,那么比这一位高的都不会产生影响,所以对所有的数取模处理一下,然后再枚举每一个数满足条件的一个区间,这个可以二分来解决。

因为每一个数的区间是 \(0=<a_i<=2^{i+1}-1\),所以之和的区间是 \(0<=a_i<=2^{i+2}-2\)

条件:

  • 两个数之和在 \([2^i,2^{i+1}-1]\)
  • 两个数之和在 \([2^{i+1}+2^i,2^{i+2}-2]\)
  1. //我还以为会wa,比较复杂度我大致算了一下可能会超时一点点。。
  2. #include <bits/stdc++.h>
  3. #define inf 0x3f3f3f3f
  4. using namespace std;
  5. const int maxn=4e5+7;
  6. typedef long long ll;
  7. int a[maxn],bit[maxn],n;
  8. int Ans[maxn];
  9. int judgemin(int sum,int x,int y){
  10. // printf("min sum=%d x=%d\n",sum,x);
  11. int l=1,r=y,ans=inf;
  12. while(l<=r){
  13. int mid=(l+r)>>1;
  14. // printf("mid=%d bit=%d\n",mid,bit[mid]);
  15. int all=bit[mid]+x;
  16. if(all>=sum) ans=mid,r=mid-1;
  17. else l=mid+1;
  18. }
  19. return ans;
  20. }
  21. int judgemax(int sum,int x,int y){
  22. // printf("max sum=%d x=%d\n",sum,x);
  23. int l=1,r=y,ans=0;
  24. while(l<=r){
  25. int mid=(l+r)>>1;
  26. // printf("bit[%d]=%d\n",mid,bit[mid]);
  27. int all=bit[mid]+x;
  28. if(all<=sum) ans=mid,l=mid+1;
  29. else r=mid-1;
  30. }
  31. return ans;
  32. }
  33. int main(){
  34. scanf("%d",&n);
  35. for(int i=1;i<=n;i++) scanf("%d",&a[i]);
  36. for(int i=0;i<=25;i++){
  37. int mod=1<<(i+1),ans=0;
  38. // printf("mod=%d\n",mod);
  39. for(int j=1;j<=n;j++) bit[j]=a[j]%mod;
  40. sort(bit+1,bit+1+n);
  41. for(int j=1;j<=n;j++){
  42. int x=bit[j];
  43. // printf("j=%d bit[%d]=%d\n",j,j,bit[j]);
  44. int lc=judgemin(1<<i,x,j-1),rc=judgemax(mod-1,x,j-1);
  45. // printf("fi lc=%d rc=%d\n",lc,rc);
  46. ans+=max(0,rc-lc+1);
  47. lc=judgemin((1<<(i+1))+(1<<i),x,j-1),rc=judgemax((1<<(i+2))-2,x,j-1);
  48. // printf("se lc=%d rc=%d\n",lc,rc);
  49. ans+=max(0,rc-lc+1);
  50. }
  51. Ans[i]=(ans&1);
  52. // printf("Ans[%d]=%d\n",i,Ans[i]);
  53. }
  54. int ans=0;
  55. for(int i=25;i>=0;i--){
  56. ans=ans*2+Ans[i];
  57. }
  58. printf("%d\n",ans);
  59. return 0;
  60. }

Codeforces Round #626 D. Present的更多相关文章

  1. Codeforces Round #626 Div2 D,E

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

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

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

  3. Codeforces Round #626 Div2 D. Present(位掩码,二分)

    题目链接:https://codeforces.com/contest/1323/problem/D 题意:给了大小为4e5的数组a,其中1<=ai<=1e7.求所有点对和的异或和,即: ...

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

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

  5. Codeforces Round #626 (Div. 2)

    Contest Info Practice Link Solved A B C D E F 4/6 O Ø Ø  Ø  Ø  - O 在比赛中通过 Ø 赛后通过 ! 尝试了但是失败了 - 没有尝试 S ...

  6. Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics)部分(A~E)题解

    (A) Even Subset Sum Problem 题解:因为n非常非常小,直接暴力枚举所有区间即可. #include<bits/stdc++.h> using namespace ...

  7. Codeforces Round #626 (Div. 2) B. Count Subrectangles

    题目连接:https://codeforces.com/contest/1323/problem/B 题意:给一个大小为n的a数组,一个大小为m的b数组,c数组是二维数组c[i][j]=a[i]*b[ ...

  8. Codeforces Round #626 (Div. 2) E. Instant Noodles(二分图,最大公因数)

    题意: 给你一个二分图,求左侧端点的所有可能子集中的点相连的右侧端点的权值的和的最大公因数. 题解: 若所有右侧端点均不在同一左侧子集中,则求所有权值的最大公因数即可 . 否则,将在相同左侧子集中的右 ...

  9. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

随机推荐

  1. MySQL锁---InnoDB行锁需要注意的细节

    前言 换了工作之后,接近半年没有发博客了(一直加班),emmmm.....今天好不容易有时间,记录下工作中遇到的一些问题,接下来应该重拾知识点了.因为新公司工作中MySQL库经常出现查询慢,锁等待,节 ...

  2. RESTful API设计的点

    RESTful API 前言 一直在使用RESTful API,但是好像概念还是很模糊的,总结下使用到的点 设计的规范 协议 API与用户的通信协议,总是使用HTTPs协议. 域名 应该尽量将API部 ...

  3. 后端code review finished 12-28

    今天只有天赋和士杰有相应的后端代码的code review工作,因为并没有召开daily scrum.只是天赋和士杰对后端所有的代码进行了review,对代码进行了整理并删除了一些残留的0 refre ...

  4. 一个好的olap框架

    一.何为一个好的olap框架? 框架大概分为两种: (1)底层技术框架,专注于抽象底层技术,如网络通信netty.中间件kafka等 (2)开发人员框架,专注于提高开发效率,如spring的面向切面和 ...

  5. vue-cli目录结构分析

    vue3初始化一个项目,查看其项目结构,会发现比vue2的更加简洁. package.json说明 项目的配置文件,定义了项目的基本信息以及项目的相关包依赖,npm运行命令等,位于项目根目录. scr ...

  6. mongo基础

    以下如有任何问题,直接到官方操作文档左上角搜索框搜索 安装 On Windows, this path is on the drive from which you start MongoDB. Fo ...

  7. 手写一个简单的HashMap

    HashMap简介 HashMap是Java中一中非常常用的数据结构,也基本是面试中的"必考题".它实现了基于"K-V"形式的键值对的高效存取.JDK1.7之前 ...

  8. python3如何不生成pyc文件

    使用-B参数 即 python3 -B test.py 设置环境变量 export PYTHONDONTWRITEBYTECODE=1 在导入的地方增加 import sys sys.dont_wri ...

  9. 关于unix环境高级编程、Linux程序设计两部书浅谈

    unix环境高级编程的术语很多,概念内容,也很多,不过学习概念性质.标准规则类的东西,想必都是这样吧——需要进行拓展的内容很多. Linux程序设计,图文并茂,代码量够足,看起来,感觉难度还可以. l ...

  10. mac、window版编辑器 webstorm 2016... 永久破解方法。

    第一步:从官网下载最新版本的webstorm编辑器(建议在官网下载,防止第三方插件恶意攻击!): 下载链接  http://www.jetbrains.com/webstorm/  , 点击 DOWN ...