题目描述

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

输入输出格式

输入格式:

第一行输入一个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. jdk和cglib简单理解

    之前使用cglib的时候不需要将classLoader作为参数传入,但动态代理却要,带着这个疑惑进入这个方法: Proxy.newProxyInstance(classLoader, interfac ...

  2. java算法----排序----(4)快速排序

    package log; public class Test4 { /** * java算法---快速排序 * * @param args */ public static void main(Str ...

  3. Luogu3220 HNOI2012 与非 数位DP

    传送门 题意:给出$N$个范围在$[0,2^k-1]$的整数,定义位运算$NAND$为位运算$AND$的逆运算,求$[L,R]$中有多少数能成为若干个前面给出的整数.若干括号和$NAND$运算组成的表 ...

  4. cp 命令有坑

    cp 是个很常用的命令, 基本语法为  cp -v  a   b  把文件a 复制为文件b(-v为显示做了什么,这是非常安全的做法,建议新手添加此参数) 参数说明: -a:此选项通常在复制目录时使用, ...

  5. nginx location url解析过程

  6. ASP.NET Core使用TopShelf部署Windows服务

    asp.net core很大的方便了跨平台的开发者,linux的开发者可以使用apache和nginx来做反向代理,windows上可以用IIS进行反向代理. 反向代理可以提供很多特性,固然很好.但是 ...

  7. linux下文件加密方法总结

    为了安全考虑,通常会对一些重要文件进行加密备份或加密保存,下面对linux下的文件加密方法做一简单总结: 方法一:gzexe加密这种加密方式不是非常保险的方法,但是能够满足一般的加密用途,可以隐蔽脚本 ...

  8. nginx的access.log文件详解

    事实证明,日志文件真的是很重要很重要的.能够帮助我们快速的定位问题,并且知道用户访问的状态,浏览器,Ip,接口地址等,简直可怕.. 一.nginx的access.log(1)对博主而言,日志文件存放在 ...

  9. pandas(DataFrame)

    DataFrame是二维数据结构,即数据以行和列的表格方式排列!特点:潜在的列是不同的类型,大小可变,标记行和列,可以对列和行执行算数运算. 其中Name,Age即为对应的Columns,序号0,1, ...

  10. docker container can not connect internet

    https://stackoverflow.com/questions/23810845/i-cant-get-docker-containers-to-access-the-internet htt ...