这道题挺神仙的,毕竟这个异或是需要进位的

看到区间和我们很自然的就想到了前缀和

于是处理一下前缀和答案就变成了这个样子

\[⊕\sum_{i=1}^n\sum_{j=1}^{i}pre_i-pre_{j-1}
\]

众所周知异或是应该按位处理的,但是这里是减法,所以还有进位需要处理

瞬间就感觉没有办法处理了

但是还是应该按位处理的,我们应该按位考虑这一位上最后的答案是什么

非常显然的一点是我们在考虑某一位的时候并不需要顾忌更靠前的位置,只需要考虑后面的位置就好了

所以我们按位考虑每一位的答案,用一个权值树状数组维护这个位置后面的数是什么

分情况讨论一下

  1. 如果这一位上是\(1\),那么后面的数无论多小都无需向前面的数借位,统计一下后面的数比他小的有多少个\(0\),比它大的有多少个\(1\)就好了

  2. 这一位是\(0\),那么后面的统计一下后面的数比他小的有多少个\(1\),同时往前最靠近的那一个\(1\),把这一位借过来之后在考虑影响就好了

复杂度\(O(nlog^2m)\)

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define re register
#define maxn 100005
#define lowbit(x) ((x)&(-x))
#define LL long long
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
int a[maxn],pre[maxn];
int c[2][1000005];
LL ans=0;
int N;
inline void add(int op,int x)
{
for(re int i=x;i<=N;i+=lowbit(i))
c[op][i]++;
}
inline LL ask(int op,int x)
{
LL ans_ask=0;
for(re int i=x;i;i-=lowbit(i))
ans_ask+=c[op][i];
return ans_ask;
}
int n;
int main()
{
n=read();
for(re int i=1;i<=n;i++) a[i]=read();
for(re int i=1;i<=n;i++) pre[i]=pre[i-1]+a[i];
LL _0=1,_1=0;
for(re int i=1;i<=n;i++)
{
if(pre[i]&1ll) ans+=_0,_1++;
else ans+=_1,_0++;
}
if(ans&1ll) ans=1;
else ans=0;
for(re LL t=1;(1<<t)<=pre[n];t++)
{
LL now=0;
memset(c,0,sizeof(c));
N=(1ll<<(t))+1;
add(0,1);
for(re int i=1;i<=n;i++)
{
int tt=pre[i]%(1ll<<t)+1;
if(pre[i]&(1ll<<t))
{
now+=ask(0,tt);
now+=ask(1,N)-ask(1,tt);
}
else
{
now+=ask(1,tt);
for(re int j=t+1;(1ll<<j)<=pre[i];j++)
if(pre[i]&(1ll<<j))
{
int p=(1ll<<j)/(1ll<<t);
now+=ask(((p-1)&1ll)^1ll,N)-ask(((p-1)&1ll)^1ll,tt);
break;
}
}
if(pre[i]&(1ll<<t)) add(1,tt);
else add(0,tt);
}
if(now&1ll) ans+=(1ll<<t);
}
std::cout<<ans;
return 0;
}

【[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. [TJOI2017]异或和

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

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

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

  6. Luogu3760 TJOI2017 异或和 树状数组

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

  7. P3760 [TJOI2017]异或和

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

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

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

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

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

随机推荐

  1. PictureBox控件

    PictureBox控件可以显示来自位图.图标或者元文件,以及来自增强的元文件.JPEG.GIF文件的图形,如果控件不足以显示整幅图像,则裁剪图像以适应控件的大小. Sizemode 图片的大小方式 ...

  2. 过滤网址和输入框中的特殊字符,防止sql注入

    using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...

  3. Linq学习以及简单用法

    Linq学习 Linq(language Intergrated Query)即语言集成查询 LINQ是一组语言特性和API,使得你可以使用统一的方式编写各种查询.用于保存和检索来自不同数据源的数据, ...

  4. C#构建树形数据结构

    转自:https://www.jb51.net/article/125747.htm 树形结构:最近在做任务管理,任务可以无限派生子任务且没有数量限制,前端采用Easyui的Treegrid树形展示控 ...

  5. (二)Apache服务器的下载与安装

    PHP的运行必然少不了服务器的支持,何为服务器?通俗讲就是在一台计算机上,安装个服务器软件,这台计算机便可以称之为服务器,服务器软件和计算机本身的操作系统是两码事,计算机自身的操作系统可以为linux ...

  6. java使用lock实现一个简单的生产者和消费者模式

    import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public ...

  7. Java处理emoji

    1.问题产生情况 我遇到这个问题是做微信开发的时候有些有用的头像用了微信的emoji表情,然而我的mysql数据库用的编码是utf8_general_ci,就是utf-8编码,结果也就报错误了. 2. ...

  8. spring中AOP的AspectJ的Execution表达式

    AspectJ的Execution表达式: 使用springAOP定义pointcut里面的execution表达式: execution()函数是常用的切点函数 "execution(* ...

  9. C#学习笔记-继承基本知识

    namespace Inheritance { class Program { static void Main(string[] args) { Dog dog = new Dog(); dog.A ...

  10. bzoj3697_FJ2014集训_采药人的路径_solution

    小道士的矫情之路: 点分治, 对于每个子树,处理其内经过根(重心)的路径,然后递归下一层子树: 如何处理经过根的合法路径 合法有两个要求: 把输入的0改成-1后 1.len=0; 2.存在一个点i使被 ...