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. zoj3659

    #include<iostream> #include<algorithm> #include<cstring> #define ll long long #inc ...

  2. python selenium打开新窗口,多窗口切换

    # coding=utf-8 from selenium import webdriver browser=webdriver.Firefox() browser.maximize_window() ...

  3. win+python+selenium实现窗口和tab切换

    这篇总结主要是关于两方面的需求:其一,在浏览器不同tab标签页之间按时间切换(同事用来不停刷新grid crontol 监控页面):其二,实现开启多个窗口,并将窗口缩放到一定范围,并齐占满整个桌面,按 ...

  4. 改变input type="file" 文字、样式等

    <div class="tac"> <input type="file" id="browsefile" class=&q ...

  5. C# 中的readonly属性

    例如我们这里有一个类 class TestClass2 { private int someValue; public void ChangeValue(int newValue) { someVal ...

  6. 删除TFS中的项目

    打开“Team Foundation Server 管理控制台”,选择应用层->团队项目集合->团队项目->点击项目集合名称,最后点击右侧出现的删除按钮

  7. Spring data JPA中使用Specifications动态构建查询

    有时我们在查询某个实体的时候,给定的条件是不固定的,这是我们就需要动态 构建相应的查询语句,在JPA2.0中我们可以通过Criteria接口查询,JPA criteria查询.相比JPQL,其优势是类 ...

  8. layui简单例子

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. 考虑实现一个不抛异常的swap

    Effective C++:参考自harttle land 类的swap实现与STL容器是一致的:提供swap成员函数, 并特化std::swap来调用那个成员函数. class Widget { p ...

  10. nginx 301重定向一种实现方法

    假设要使用的域名是b.com,以前的老域名是a.com,则以下设置让nginx把a.com的请求访问转发到b.com,并返回301给浏览器. server { listen 80; server_na ...