BZOJ

洛谷

\(Description\)

求所有区间和的异或和。

\(n\leq 10^5,\ \sum a_i\leq 10^6\)。

\(Solution\)

这样的题还是要先考虑按位做。

记\(s_i\)表示前缀和(\(s_0\)=0)。假设当前是第\(k\)位,我们要统计区间和在第\(k\)位为\(1\)的区间有多少个(或是奇偶性)。

枚举区间右端点\(i\),然后我们要统计有多少个\(s_i-s_j\)在第\(k\)位为\(1\)。

当\(s_i\)第\(k\)位为\(1\)时:

  如果\(s_j\)第\(k\)位为\(0\),那\(s_j\)的后\(k\)位必须小于等于\(s_i\)的后\(k\)位才不会发生退位,\(s_i\)第\(k\)位上的\(1\)才能保留。

  如果\(s_j\)第\(k\)位为\(1\),那\(s_j\)的后\(k\)位必须大于\(s_i\)的后\(k\)位,才能退位使得\(s_i-s_j\)的第\(k\)位为\(1\)。

当\(s_i\)第\(k\)位为\(0\)时,同理讨论一下就可以了。(其实要注意\(s_i\)是不减的,这样前\(k\)位的影响很容易被处理掉)

所有数的和是\(\leq10^6\)的。所以对于每一位,我们用两个权值树状数组维护第\(k\)位为\(0/1\)的\(s_i\)的后\(k\)位就可以了。

复杂度\(O(n\log^2A)\)。

似乎还可以只用一个树状数组做?不管了懒得思考.jpg。大体看了下,差不多也是这样讨论,但是可以直接求区间和代替,不需要讨论\(s_j\)这一位是0还是1...

还可以用FFT做(虽然常数有点大过不去),但是我怎么看不懂啊=-=。

//3652kb	1036ms
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 500000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e5+5; int sum[N];
char IN[MAXIN],*SS=IN,*TT=IN;
struct BIT
{
#define N 1000005
int n;
bool t[N];
#undef N
#define lb(x) (x&-x)
inline void Clear()
{
memset(t,0,n+1<<1);
}
inline void Add(int p)
{
for(; p<=n; p+=lb(p)) t[p]^=1;
}
inline bool Query(int p)
{
bool res=0;
for(; p; p^=lb(p)) res^=t[p];
return res;
}
}T0,T1; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
} int main()
{
const int n=read();
for(int i=1; i<=n; ++i) sum[i]=sum[i-1]+read();
int ans=0;
for(int k=0; 1<<k<=sum[n]; ++k)
{
T0.Clear(), T1.Clear();
T0.n=T1.n=1<<k, T0.Add(1);
int s=0;
for(int i=1,t0=1,t1=0,lim=(1<<k)-1; i<=n; ++i)
{
int val=sum[i]&lim;
if(sum[i]>>k&1)
s^=t1^T1.Query(val+1)^T0.Query(val+1), T1.Add(val+1), t1^=1;//(t1-T1.Query(val+1)+T0.Query(val+1))&1, ++t1;
else
s^=t0^T0.Query(val+1)^T1.Query(val+1), T0.Add(val+1), t0^=1;//(t0-T0.Query(val+1)-T1.Query(val+1))&1, ++t0;
}
ans+=s<<k;
}
printf("%d\n",ans); return 0;
}

BZOJ.4888.[TJOI2017]异或和(树状数组)的更多相关文章

  1. Luogu3760 TJOI2017 异或和 树状数组

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

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

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

  3. BZOJ 4888 [Tjoi2017]异或和

    题解:对每一位分别考虑贡献 先求前缀和 按照二进制减法分类讨论,求出最终这一位是1还是0 用树状数组维护 注意:树状数组对0这个位置单独考虑 #include<iostream> #inc ...

  4. BZOJ 2819: Nim dfs序维护树状数组,倍增

    1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家.2.把堆v中的石子数变为k. 分析: ...

  5. BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

    题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...

  6. bzoj 3730 震波——动态点分治+树状数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3730 查询一个点可以转化为查询点分树上自己到根的路径上每个点对应范围答案.可用树状数组 f ...

  7. 【Foreign】异色弧 [树状数组]

    异色弧 Time Limit: 20 Sec  Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample Input 8 1 ...

  8. P5057 [CQOI2006]简单题 前缀异或差分/树状数组

    好思路,好思路... 思路:前缀异或差分 提交:1次 题解:区间修改,单点查询,树状数组,如思路$qwq$ #include<cstdio> #include<iostream> ...

  9. 洛谷 P6225 [eJOI2019]异或橙子 (树状数组)

    题意:有\(n\)个数,起始值均为\(0\),进行\(q\)次操作,每次输入三个数,如果第一个数为\(1\),则将第\(i\)个数修改为\(j\),如果为\(2\),则求区间\([l,r]\)内的所有 ...

随机推荐

  1. C++ StrCat()

    关于StrCat function,参考:https://msdn.microsoft.com/en-us/library/windows/desktop/bb759925(v=vs.85).aspx ...

  2. HTMLTestRunner 美化版本

    前言 ​最近小伙伴们在学玩python,,看着那HTMLTestRunner生成的测试报告,左右看不顺眼,终觉得太丑.搜索了一圈没有找到合适的美化报告,于是忍不住自已动手进行了修改,因习惯python ...

  3. 将眼底图片生成的txt文件进行格式化处理

    # -*- coding: utf-8 -*- """ 将图片转换生成的txt文件进行格式化处理 """ import os import ...

  4. windows下使用Play框架

         play类似于Spring这里的web框架.特点:MVC.函数编程. 版本:play 2.1.3 一.play命令 #play ~compile 功能:持续编译.在cmd中运行这个命令,只要 ...

  5. 【C++ Primer | 03】字符串、向量和数组

    博客链接: c++ 中 const_iterator 和 const vector<>::iterator的区别 const vector <int> ::iterator和v ...

  6. Html中,id、name、class、type的区别

    <input type="text" name="name" id="name" class="txt"> ...

  7. 提高VS项目的压缩文件大小

    对于.NET项目,如果将编译方式由Debug改为Release,使用压缩软件压缩项目文件时可以大大减少压缩文件的大小,具体原因待查.

  8. file /usr/share/mysql/charsets/README from install of MySQL-server-5.1.73-1.glibc23.i386 conflicts with file from package mysql-libs-5.1.73-8.el6_8.i686

    1:也许之前的机器安装过Mysql,但是自己不知道,账号密码也忘记了,又执行安装操作,导致Mysql不兼容问题.Linux上安装MySQL时出现不兼容的解决办法,错误如下所示: [root@maste ...

  9. KnocoutJs+Mvc+BootStrap 学习笔记(Mvc)

    Mvc   1.Html 增加扩展方法 using System.Web.Mvc; namespace KnockoutBootstrapMvc.Entensions { public static ...

  10. T37302 P哥的桶

    题解: 比较简单的一道题 线段树+线性基 显然离线处理出位置 然后线段树updata的时候暴力合并线性基 nlogn^3 一个常数优化就是线性基已满就直接返回这个线性基 还有个优化是用快速找到第一个1 ...