Description

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

Input

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

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

Output

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

Sample Input

3

1 2 3

Sample Output

0

Hint

【样例解释】

序列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

题解

难得一道省选题看一眼就有思路的。一般这种异或都是按位一位一位做的。

定义$sum$为前缀和,我们开两个权值树状数组,一个表示处理到第$i$位时,$sum[j]$的第$i$位为$1$,$0$~$j-1$中$sum$的$1$~$i-1$位的值域,另一个表示$sum[j]$的第$i$位为$0$的情况。

统计答案时,有两种情况:

1.$sum[j]$的第$i$位为$1$,由于$sum$数组是单调递增的(这是一个很重要的性质),那么以$j$为子序列右端点的子序列第$i$位为$1$的情况只有两种:

  (1)左端点第$i$位为$0$,并且$1$~$i-1$位小于右端点($j$)的$1$~$i-1$位;

  (2)左端点第$i$位为$1$,并且$1$~$i-1$位大于右端点($j$)的$1$~$i-1$位。(这里特别说明一下,因为刚才说过了$sum$单调递增,所以能够保证减出来不会出现负数)

2.$sum[j]$的第$i$位为$0$,那么以$j$为子序列右端点的子序列第$i$位为$1$的情况也只有两种:

  (1)左端点第$i$位为$1$,并且$1$~$i-1$位小于右端点($j$)的$1$~$i-1$位;

  (2)左端点第$i$位为$0$,并且$1$~$i-1$位大于右端点($j$)的$1$~$i-1$位。

其实就是竖式减法。

//It is made by Awson on 2017.9.28
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define LL long long
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define sqr(x) ((x)*(x))
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N = 1e5;
const int bit_size = 1e6;
int st[];
void read(int &x) {
char ch; bool flag = ;
for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || ); ch = getchar());
for (x = ; isdigit(ch); x = (x<<)+(x<<)+ch-, ch = getchar());
x *= -*flag;
} int sum[N+], a[N+];
int c[bit_size+][];
int n, maxn; void add(bool bit, int x) {
for (; x <= maxn+; x += lowbit(x)) c[x][bit]++;
}
int cunt(bool bit, int x) {
int cnt = ;
for (; x; x -= lowbit(x)) cnt += c[x][bit];
return cnt;
}
void work() {
st[] = ;
for (int i = ; i <= ; i++) st[i] = st[i-]<<;
read(n);
for (int i = ; i <= n; i++)
read(sum[i]), sum[i] += sum[i-];
maxn = sum[n];
int ans = ;
for (int i = ; i <= ; i++) {
if (st[i] > maxn) break;
memset(c, , sizeof(c));
add(, );
int flag = ;
for (int j = ; j <= n; j++) {
int tmp = st[i]&sum[j], cnt;
if (tmp) cnt = cunt(, a[j]+)+cunt(, maxn+)-cunt(, a[j]+);
else cnt = cunt(, a[j]+)+cunt(, maxn+)-cunt(, a[j]+);
if (cnt%) flag ^= ;
add((bool)(tmp), a[j]+);
a[j] |= tmp;
}
ans |= st[i]*flag;
}
printf("%d\n", ans);
}
int main() {
work();
return ;
}

[TJOI 2017]异或和的更多相关文章

  1. [TJOI 2017]可乐

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

  2. Week Three

    2018.12.10 1.[BZOJ 4818][P 3702] 2.[AGC007 A] 3.[AGC007 B] 4.[AGC007 C] 5.[AGC007 D] 2018.12.11 1.[B ...

  3. 2017 ACM-ICPC Asia Xi'an Problem A XOR(异或线性基 )

    题目链接  2017西安赛区 Problem A 题意  给定一个数列,和$q$个询问,每个询问中我们可以在区间$[L, R]$中选出一些数. 假设我们选出来的这个数列为$A[i_{1}]$, $A[ ...

  4. Trie树/字典树题目(2017今日头条笔试题:异或)

    /* 本程序说明: [编程题] 异或 时间限制:1秒 空间限制:32768K 给定整数m以及n个数字A1,A2,..An,将数列A中所有元素两两异或,共能得到n(n-1)/2个结果,请求出这些结果中大 ...

  5. 异数OS 2017 DPDK 峰会观后感

    1.DPDK in Container 使用虚拟网卡设备技术为每一个容器分配一个IP 网卡适配器(queue).容器技术可以解决虚拟机技术中虚拟机过于臃肿,难于热迁移的问题,可能可以代替美团OVS方案 ...

  6. RAC异机恢复

    RAC异机恢复PDCL到PFCL: PNCL:RAC+ASM ,product env   db name:PNCL   instance:PDCL1 PDCL2 PFCL:RAC+ASM ,perf ...

  7. 【2017年新篇章】 .NET 面试题汇总(二)

    本次给大家介绍的是我收集以及自己个人保存一些.NET面试题第二篇 第一篇文章请到这里:[2017年新篇章] .NET 面试题汇总(一) 简介 此次包含的不止是.NET知识,也包含少许前端知识以及.ne ...

  8. 【机器学习】神经网络实现异或(XOR)

    注:在吴恩达老师讲的[机器学习]课程中,最开始介绍神经网络的应用时就介绍了含有一个隐藏层的神经网络可以解决异或问题,而这是单层神经网络(也叫感知机)做不到了,当时就觉得非常神奇,之后就一直打算自己实现 ...

  9. X-NUCA 2017 web专题赛训练题 阳光总在风雨后和default wp

     0X0.前言 X-NUCA 2017来了,想起2016 web专题赛,题目都打不开,希望这次主办方能够搞好点吧!还没开赛,依照惯例会有赛前指导,放一些训练题让CTFer们好感受一下题目. 题目有一大 ...

随机推荐

  1. qt中控件的使用函数

    1.Text Edit编辑框 //将编辑框中的内容转化成Utf8编码 ui->textEdit->toPlainText().toUtf8(); 2.Combo Box下拉框的应用 (1) ...

  2. uboot中的命令体系

    一.uboot的命令体系介绍以及实例分析: U-Boot 的命令实现大多在 common 目录下.在该目录下命令的代码文件都是以“ cmd_”开头的,如下图所示: 其中每一个文件都是一个命令实现的代码 ...

  3. 高级软件工程2017第6次作业--团队项目:Alpha阶段综合报告

    高级软件工程2017第6次作业--团队项目:Alpha阶段综合报告 Deadline:2017-10-30(周一)21:00pm (注:以下内容参考集大作业4,集大作业5,集大作业6,集大作业7 一. ...

  4. Android实验报告

    实验名称:Android程序设计 实验时间:2017.5.24 实验人员:20162309邢天岳(结对同学20162313苑洪铭) 实验目的:使用android stuidio开发工具进行基本安卓软件 ...

  5. 关于tomcat部署应用的三种方式

    关于tomcat部署应用虽然不是一个经常的操作,因为一旦选择了一种部署方式,我们其他的应用就会不经大脑的使用这种既定模式, 如果不使用这种部署方式,但是对于其他的部署方式不是很清楚的话,很容易抓瞎,所 ...

  6. PM2使用心得

    PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控.自动重启.负载均衡等,而且使用非常简单. 安装 npm install -g pm2 常用命令 $ npm i ...

  7. 自制 h5 音乐播放器 可搜索

    闲言碎语: 有好几天没有发表博客了,这也是因为一直开发音乐和完善我的博客项目,好不容易抽出时间总结一下这几天所做的东西,笔试又不断通知,实则匆忙 今天难得逃了一次课,就趁这时间,该写写就写写吧~~ 进 ...

  8. JAVA_SE基础——56.包的创建

    接下来我来给大家讲下--包 , 先看一段代码 class Demo1{ public static void main(String[] args) { System.out.println(&quo ...

  9. token 验证

    组件: https://jwt.io/#libraries-io

  10. JAVA 中的 反射

    CLASS类 1) 在面向对象的世界里,万事万物皆对象. 在java中有两样东西不是面向对象 1.普通的数据类型(java中有封装类来弥补它) 2. java中静态的东西 2) 类是对象吗? 类是对象 ...