题目描述

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

输入输出格式

输入格式:

第一行输入一个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

一般这种异或都是按位一位一位做的

对于某第k位,如果为1,那么说明

所有连续和异或的这第k位为1

如果满足这第k位为1的(s[i]-s[j])有cnt个

如果cnt为奇数,那么说明答案的第k位也等于1

如何求出第k位为1的(i,j)对数?

如果sum[i]第k位为1:

为了使第k位为1,要么sum[j]第k位为0且sum[j]前k-1位小于sum[i]前k-1位的大小

原因是如果红色条件不成立,进位后就变成了0

还有就是sum[j]第k位为1且sum[j]前k-1位大于sum[i]前k-1位的大小

同理,也是进位的问题

那么红色部分要求满足大小关系的对数,用两个树状数组就行

第k位为0同理

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int c[][],s[],a[],ans;
int pw[],n;
void add(int x,int y)
{
while (x<=)
{
c[x][y]++;
x+=(x&(-x));
}
}
int query(int x,int y)
{
int sum=;
while (x)
{
sum+=c[x][y];
x-=(x&(-x));
}
return sum;
}
int main()
{int i,j,flag,cnt;
cin>>n;
for (i=;i<=n;i++)
{
scanf("%d",&s[i]);
s[i]+=s[i-];
}
pw[]=;
for (i=;i<=;i++)
pw[i]=pw[i-]*;
for (i=;i<=;i++)
if (pw[i]<=s[n])
{
memset(c,,sizeof(c));
flag=;
add(,);
for (j=;j<=n;j++)
{
int tmp=s[j]&pw[i];
if (tmp) cnt=query(a[j]+,)+query(,)-query(a[j]+,);
else cnt=query(a[j]+,)+query(,)-query(a[j]+,);
if (cnt%==) flag^=;
add(a[j]+,(bool)tmp);
if (tmp) a[j]|=pw[i];
}
if (flag) ans|=(pw[i]);
}
cout<<ans;
}

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

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

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

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

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

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

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

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

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

  5. Luogu3760 TJOI2017 异或和 树状数组

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

  6. P3760 [TJOI2017]异或和

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

  7. 【[TJOI2017]异或和】

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

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

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

  9. BZOJ4888 [Tjoi2017]异或和 【树状数组】

    题目链接 BZOJ4888 题解 要求所有连续异或和,转化为任意两个前缀和相减 要求最后的异或和,转化为求每一位\(1\)的出现次数 所以我们只需要对每一个\(i\)快速求出\(sum[i] - su ...

随机推荐

  1. 网上找的hadoop面试题目及答案

    1.Hadoop集群可以运行的3个模式? 单机(本地)模式 伪分布式模式全分布式模式2. 单机(本地)模式中的注意点? 在单机模式(standalone)中不会存在守护进程,所有东西都运行在一个JVM ...

  2. codevs 3981 动态最大子段和

    3981 动态最大子段和 http://codevs.cn/problem/3981/    题目等级 : 钻石 Diamond   题目描述 Description 题目还是简单一点好... 有n个 ...

  3. LoadRunner录制手机APP教程

    1.     开启fiddler 2.     打开HP Virtual User Generator,新建->Web (HTTP/HTML)>创建 3.     点击开始录制: (1) ...

  4. nyoj 擅长排列的小名II

    擅长排列的小明 II 时间限制:1000 ms  |           内存限制:65535 KB 难度:3   描述 小明十分聪明,而且十分擅长排列计算. 有一天小明心血来潮想考考你,他给了你一个 ...

  5. 我自己总结的C#开发命名规范整理了一份

    我自己总结的C#开发命名规范整理了一份 标签: 开发规范文档标准语言 2014-06-27 22:58 3165人阅读 评论(1) 收藏 举报  分类: C#(39)  版权声明:本文为博主原创文章, ...

  6. phpadmin增加使得项目能连接数据库

    感谢:http://jingyan.baidu.com/article/e4511cf332b9832b845eaf27.html 值得注意: 1.phpadmin的目录:D:\developsoft ...

  7. 解决SoapFault (looks like we got no XML document)问题

    今天在调试项目的时候出现下面的错误信息: SoapFault looks like we got no XML document (D:\phpStudy\WWW\self.shop.xunmall. ...

  8. Linq 透明标识符

    IEnumerable<Person> list = new List<Person> { , Id = }, , Id = }, , Id = }, , Id = }, , ...

  9. Python内置函数(65)——staticmethod

    英文文档: staticmethod(function) Return a static method for function. A static method does not receive a ...

  10. 链家2018春招Java工程师编程题题解

    Light 题目描述 在小红家里面,有n组开关,触摸每个开关,可以使得一组灯泡点亮.现在问你,使用这n组开关,最多能够使得多少个灯泡点亮呢? 输入 第一行一个n,表示有n组开关.接下来n行,每行第一个 ...