题目描述

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

输入输出格式

输入格式:

第一行输入一个n,表示这序列的数序列 第二行输入n个数字a1,a2...an代表这个序列

0<=a1,a2,...an,0<=a1+a2...+an<=10^6


输出格式:

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

输入输出样例

输入样例#1:

3
1 2 3
输出样例#1:

0

说明

【样例解释】

序列1 2 3有6个连续和,它们分别是1 2 3 3 5 6,则1 xor 2 xor 3 xor 3 xor 5 xor 6 = 0

【数据范围】

对于20%的数据,1<=n<=100

对于100%的数据,1<=n <= 10^5

Solution:

  noip2018结束了,省一稳了,但分数真的很不满意,WC和省选都是奢望了,我应该也就此AFO了吧!游记什么的等分数线出来了再抽空补上(实际是想以noip2018游记作为最后一篇我关于OI的博客),先得把前段时间做的一些题目补上。

  本题非常巧妙的位运算+树状数组。

  我们按位来统计,若某一位为$1$的子段和个数为奇数个,则答案累加该位的位权。那么问题变为如何快速统计某一位为$1$的子段和有多少个。

  我们对原数组先作前缀和$s$,那么对于$s_i$,我们统计以$i$为结尾的当前位为$1$的子段和有多少个,这里可以用两个树状数组分别维护当前位为$0$和$1$的个数,来辅助统计。

  具体来说,若$s_i$的当前位为$1$,那么我们要找一个$j,j<i$使得$s_i-s_j$的当前位为$1$,需要统计的就是满足条件的$j$的个数,由于$s_i$的当前位为$1$,显然满足条件的$s_j$有两种情况:1、$s_j$的当前位为$1$且$s_j$的当前位之前的位的$01$值大于$s_i$的当前位之前的位的$01$值(这样用$s_i-s_j$就需要借位使得减得的值当前位为$1$); 2、$s_j$的当前位为$0$且$s_j$的当前位之前的位的$01$值小于等于$s_i$的当前位之前的$01$值(这样用$s_i-s_j$就直接会使减得的值当前位为$1$)。于是统计时只需要累加维护$0$和维护$1$的两个树状数组满足条件的$s_j$个数,然后把$s_i$的当前位之前的位的值按当前位为$0$或$1$插入对应的树状数组中就好了。同理可以去考虑$s_i$当前位为$0$的情况。

  注意细节:树状数组统计不能从$0$开始(受lowbit限制),所以得整体右移一位,最开始的时候还得先插入一个$s_0=0$!

代码:

/*Code by 520 -- 10.30*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=1e6+;
int n,s[N],c[][N],ans; il void update(int tag,int x){while(x<N)c[tag][x]++,x+=x&(-x);} il int query(int tag,int x){int res=;while(x)res+=c[tag][x],x-=x&(-x);return res;} int main(){
scanf("%d",&n);
For(i,,n) scanf("%d",s+i),s[i]+=s[i-];
For(i,,) {
int lim=(<<i)-,pos; ll tot=;
if(lim>s[n]) break;
memset(c,,sizeof(c));
update(,);
For(j,,n){
pos=(s[j]&lim)+;
if(s[j]&(<<i))
tot+=query(,pos)+query(,)-query(,pos),update(,pos);
else
tot+=query(,pos)+query(,)-query(,pos),update(,pos);
}
if(tot&) ans|=(<<i);
}
cout<<ans;
return ;
}

P3760 [TJOI2017]异或和的更多相关文章

  1. 洛谷P3760 - [TJOI2017]异或和

    Portal Description 给出一个\(n(n\leq10^5)\)的序列\(\{a_n\}(\Sigma a_i\leq10^6)\),求该数列所有连续和的异或和. Solution 线段 ...

  2. luogu P3760 [TJOI2017]异或和

    传送门 对于每个二进制位考虑有多少区间和这一位上为1 从前往后扫每个前缀和,如果当前这个前缀和某一个二进制位上为1,因为区间和由这个前缀和减去前面的前缀和得来,如果减去了这一位为0的前缀和,那么 减去 ...

  3. 【BZOJ4888】[TJOI2017]异或和(树状数组)

    [BZOJ4888][TJOI2017]异或和(树状数组) 题面 BZOJ 洛谷 题解 考虑每个位置上的答案,分类讨论这一位是否存在一,值域树状数组维护即可. #include<iostream ...

  4. 【bzoj4888】: [Tjoi2017]异或和 BIT-乱搞

    [bzoj4888]: [Tjoi2017]异或和 题目大意:给定一个序列,求这个序列所有的连续和的异或值.(n<=1e5 ai<=1e6) 想了各种奇怪的方法就是不会做啊啊啊.. Orz ...

  5. [TJOI2017]异或和

    题目描述 在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的.所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的 简单.但今天小明遇到了一个序列和的难题,这个题目不 ...

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

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

  7. Luogu3760 TJOI2017 异或和 树状数组

    传送门 题意:给出一个长度为$N$的非负整数序列,求其中所有连续区间的区间和的异或值.$N \leq 10^5$,所有元素之和$\leq 10^6$ 设序列的前缀和为$s_i$,特殊地,$s_0=0$ ...

  8. 【[TJOI2017]异或和】

    这道题挺神仙的,毕竟这个异或是需要进位的 看到区间和我们很自然的就想到了前缀和 于是处理一下前缀和答案就变成了这个样子 \[⊕\sum_{i=1}^n\sum_{j=1}^{i}pre_i-pre_{ ...

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

    题目描述 在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的.所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的简单.但今天小明遇到了一个序列和的难题,这个题目不仅 ...

随机推荐

  1. JavaScript中的slice函数

    String.slice(start,end)returns a string containing a slice, or substring, of string. It does not mod ...

  2. Android popupMenu

    popupMenu = new PopupMenu(ActivityHousesNumList.this, imageViewhousesnum1); popupMenu.getMenuInflate ...

  3. eclipse 如何引入本地dtd

    一.首先修改xml的打开方式为:XML editor 1.菜单:Window -> Preferences ->General -> Editors -> File  Asso ...

  4. virtualbox - 2台虚拟机之间通过ssh互访

    virtualbox 5.2.12 一台虚拟机是Debian 9,另一台是Ubuntu 18.04. 注意: 2台虚拟机系统里要安装ssh ! sudo apt install ssh 然后在virt ...

  5. CF1060D Social Circle 排序

    题目传送门:http://codeforces.com/problemset/problem/1060/D 题意:有$N$个人,你要让他们坐成若干个圆环.他们每个人需要坐一把椅子,左手边至少要有$l_ ...

  6. 开源的mqtt服务器

    看介绍挺强大,开源,可运行在Linux和Windows,文档中有相关测试工具,及客户端介绍. 希望有机会应用.http://www.emqtt.com/

  7. kettle学习笔记——插件的安装与使用

    一.概述 暂略 二.ODPS插件 https://yq.aliyun.com/articles/68911

  8. YY:2018互联网创业公司应看清的事情

    潮流,技术,生活方式,盈利模式,消费人群几乎每年都在改变,2018,你看到的是怎样的一盘棋. 2018年是个很好的数字,很多互联网公司寄予希望在这个幸运数字年头奋起一搏,拿到一份可观的酬金.特别是一些 ...

  9. kvm虚拟化管理平台WebVirtMgr部署-完整记录(1)

    公司机房有一台2U的服务器(64G内存,32核),由于近期新增业务比较多,测试机也要新增,服务器资源十分有限.所以打算在这台2U服务器上部署kvm虚拟化,虚出多台VM出来,以应对新的测试需求.当KVM ...

  10. Linux基础实践

    Linux基础实践 1.1 应用安装 要求:掌握软件源的维护方法,配置系统使用软件源镜像.掌握通过软件源来查找,安装,卸载,更新软件的方法 备份原地址列表文件:sudo cp /etc/apt/sou ...