Description

在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题目都是与序列的连续和相关的。所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的简单。但今天小明遇到了一个序列和的难题,这个题目不仅要求你快速的求出所有的连续和,还要快速的求出这些连续和的异或值。小明很快的就求出了所有的连续和,但是小明想考考你,在不告诉连续和的情况下,让你快速的求出序列所有的连续和的异或值。

Input

第一行输入一个nn,表示这序列的数字个数。

第二行输入nn个数字a1,a2,a3a1,a2,a3...anan,代表这个序列。

0≤a1,a2,0≤a1,a2,...,an,0≤a1+a2+,an,0≤a1+a2+...+an≤106+an≤106。

Output


输出这个序列所有的连续和的异或值。

Sample Input

3
1 2 3

Sample Output

0

HINT

对于20%20%的数据,1≤n≤10001≤n≤1000
对于100%100%的数据,1≤n≤105

Source

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

位运算+树状数组+思路~

先求出前缀和a[i],因为异或运算只与单个二进制位有关,所以我们按位来算,只需20位。

对于一位k,我们线性扫过所有前缀和,对于i,如果i的k位==1,那么只有当j<i && j&(1<<k)!=0 && j%(1<<k)>i%(1<<k)

或者j<i && j&(1<<k)==0 && j%(1<<k)<i%(1<<k)时才能更新答案,所以我们记录两个树状数组,分别维护在i之前的k位为1和0的数的个数,位置由j%(1<<k)决定,就可以更新答案了。

位运算没有加括号……以后要注意啊~

#include<cstdio>int n,a[100001],c[1<<20][2],ans,rev[21];int read()
{int x=0,f=1;char ch=getchar();while(ch<'0' || ch>'9') {if(ch=='-') f=-1;ch=getchar();}while(ch>='0' && ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
}void add(int u,int v,int k)
{for(u++;u<=rev[20];u+=u&(-u)) c[u][k]+=v;
}int cal(int u,int k)
{int now=0;for(u++;u;u-=u&(-u)) now+=c[u][k];return now;
}int main()
{n=read();rev[0]=1;for(int i=1;i<=20;i++) rev[i]=rev[i-1]<<1;for(int i=1;i<=n;i++) a[i]=a[i-1]+read();for(int k=0;k<20;k++){int now=0;for(int i=1;i<=n;i++){int x,y;x=((a[i]&rev[k])!=0);y=a[i]%rev[k];if(x) now++;now+=cal(rev[k]-1,x)-cal(y,x)+cal(y,x^1);add(y,1,x);}if(now&1) ans|=rev[k];for(int i=1;i<=n;i++) add(a[i]%rev[k],-1,(a[i]&rev[k])!=0);}printf("%d\n",ans);return 0;
}

BZOJ 4888 [Tjoi2017] 异或和相关推荐

  1. BZOJ.4888.[TJOI2017]异或和(树状数组)

    BZOJ 洛谷 \(Description\) 求所有区间和的异或和. \(n\leq 10^5,\ \sum a_i\leq 10^6\). \(Solution\) 这样的题还是要先考虑按位做. ...

  2. [bzoj 4887] [Tjoi2017]可乐

    传送门 Description 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且 放在了加里敦星球的1号城市上.这个可乐机器人有三种行为:停在原地,去下一个相邻的 城市 ...

  3. 【BZOJ 4671】异或图 【斯特林反演】【线性基】【贝尔数复杂度】

    传送门 题意:定义两个图的异或的边集为在两张图中恰出现一次的边.给sss张nnn个点的图的集合,求异或和为连通图的子集数. s≤60,n≤10s \leq 60,n \leq 10s≤60,n≤10 ...

  4. BZOJ 3261: 最大异或和位置-贪心+可持久化01Trie树

    3261: 最大异或和 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 3519  Solved: 1493 [Submit][Status][Dis ...

  5. bzoj 3261 最大异或和【可持久化trie】

    因为在后面加数字又求后缀和太麻烦,所以xor[p...n]=xor[1...n]^xor[p-1...n]. 首先处理出来区间异或前缀和,对前缀和建trie树(在最前面放一棵0表示最开始的前缀和 然后 ...

  6. BZOJ 3261: 最大异或和 [可持久化Trie]

    3261: 最大异或和 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1513  Solved: 657 [Submit][Status][Disc ...

  7. BZOJ.3261.最大异或和(可持久化Trie)

    题目链接 这个每次修改后缀好像很难搞,但是因为异或可以抵消,求sum[p~n]的最大值可以转化为求sum[1~n] xor sum[1~p-1]的最大值. \(p-1\in [l-1,r-1]\),用 ...

  8. BZOJ 4892: [Tjoi2017]DNA(SA+RMQ / SAM)

    Description 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S,有这个序列的碱基序列就会表现出喜欢吃藕的 性状,但是研究人员发现对碱基序列S,任意修改其中不超过3个碱基,依然能够 ...

  9. [luogu3760 TJOI2017] 异或和(树状数组)

    传送门 Solution 一位一位考虑,直接得到答案中第i为是否为1 Code //By Menteur_Hxy #include <ctime> #include <cmath&g ...

最新文章

  1. IBM发布未来五年五大科技预测
  2. 服务器能进安全模式进不去系统,远程服务器怎么进安全模式
  3. DLL load failed: 页面文件太小,无法完成操作
  4. Selenium3自动化测试——1. 新建第一个Selenium自动化测试脚本
  5. C#使用Word中的内置对话框实例
  6. 二维数组中的查找---剑指Offer
  7. 将Windows 8.1 系统窗口背景设置成淡绿色?
  8. 【Java单元测试】如何进行单元测试、异常测试、参数化测试、超时测试、测试多线程
  9. 设计模式:依赖倒置原则
  10. linux dns 内网ip,Ubuntu中ip地址、网关、网络号、DNS等解释
  11. undo log mysql_MySQL的redo log与undo log
  12. SpringMVC学习笔记(2)-参数绑定的常用方法
  13. python存数据到impala_0039-如何使用Python Impyla客户端连接Hive和Impala
  14. 联想拯救者Y7000p+Nvidia rtx2060 显卡驱动安装
  15. 笔记本重装win10系统
  16. 网络小说写作套路_关于网络写作的6个常见问题,已回答
  17. 【新手入门必看】git 和 github 介绍
  18. 有计划,坚决执行——写给大三犹豫的女生
  19. Linux并行执行权限,如何在Linux中使用flock控制程序的异步执行
  20. 一个用户只能登录一次

热门文章

  1. 局部色调映射(Local Tone Mapping)
  2. 仿淘宝实现鼠标移入图片,图片放大功能
  3. 华为少帅李一男是如何沦陷的【附任正非讲话】
  4. 单片机是指把组成微型计算机的各功能部件即,单片机结题报告.doc
  5. Python新手入门基础,看完让你会有意想不到的收获
  6. outlook 2010 为啥设置签名没反应
  7. C#日历calendar.cs
  8. 楚列斯基分解法、求矩阵范数的C++实现
  9. 在开课吧的Python学习
  10. excel部分网格线不见了_简单3步!用Excel制作电子印章,让你的文档更高大上