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 1000005int 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;elses^=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;
}

转载于:https://www.cnblogs.com/SovietPower/p/10264193.html

BZOJ.4888.[TJOI2017]异或和(树状数组)相关推荐

  1. [luogu3760 TJOI2017] 异或和(树状数组)

    传送门 Solution 一位一位考虑,直接得到答案中第i为是否为1 Code //By Menteur_Hxy #include <ctime> #include <cmath&g ...

  2. BZOJ 4888 [Tjoi2017] 异或和

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

  3. BZOJ.3648.寝室管理(点分治 树状数组)

    BZOJ \(Description\) 求在一棵树上加一条边后,有多少条至少有\(k\)个点的路径. \(n\leq10^5\). \(Solution\) 对于一棵树的情况,可以点分治. 用树状数 ...

  4. bzoj 1264: [AHOI2006]基因匹配Match (树状数组优化dp)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1264 思路: n大小为20000*5,而一般的dp求最长公共子序列复杂度是 n*n的,所以我 ...

  5. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

  6. 【BZOJ】1012: [JSOI2008]最大数maxnumber 树状数组求区间最值

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1012 题意:维护一个数列,开始时没有数值,之后会有两种操作, Q L :查询数列末 ...

  7. bzoj 1878: [SDOI2009]HH的项链 ——树状数组+ 差分

    Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此他的项链变得 ...

  8. bzoj 2131: 免费的馅饼(树状数组+DP)

    2131: 免费的馅饼 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 408  Solved: 245 [Submit][Status][Discu ...

  9. 【BZOJ 3155】Preprefix sum(树状数组)

    显然是不能直接开两个树状数组维护 前缀和,前缀和的前缀和.因为一旦对a[i]进行修改,将会影响许多位前缀和的前缀和 我们考虑对式子变一下形 Qi =S1+S2+S3+...+Si =a1+a1+a2+ ...

最新文章

  1. windows桌面待办事项_想在手机桌面上安装一个便利贴,下载什么便签软件好?
  2. python默认参数举例_Python之在函数中使用列表作为默认参数
  3. vue --- 提交表单到服务器
  4. navicat 或者workbench 无法连接127.0.0.1(61)的解决方法
  5. Java Spring IOC用法
  6. arm中clz指令_JavaScript中带有示例的Math.clz32()方法
  7. linux 如何关闭屏幕录像,如何使用GNOME Shell隐藏的屏幕录像工具
  8. redis 命令大全
  9. WGCLOUD部署对服务器硬件配置的一些建议
  10. C盘里的HTML是什么文件,C盘Windows下的winsxs是什么文件可以删除吗
  11. win10修改用户名_win10最详细优化设置|win10专业版笔记本优化教程
  12. PHP根据年月获取月初月末时间
  13. 程序猿的情怀 语录(三)
  14. Java 一个数字、字母、汉字各占几个字节
  15. JS最佳实践——红皮书
  16. 【论文阅读】SABRE: Protecting Bitcoin against Routing Attacks
  17. Unity Mathf【Deg Rad】- 关于数学运算中的度与弧度
  18. 2021年全球望远镜收入大约1161.6百万美元,预计2028年达到1275百万美元
  19. 静态全局变量和全局变量的区别
  20. 数据库管理工具——SQuirreL SQL Client使用入门

热门文章

  1. App_GlobalResources、App_LocalResources (理论篇)(
  2. 2010年度报告:是谁在编写Linux内核?
  3. 关于Raid0,Raid1,Raid5,Raid10的总结
  4. Visual Studio Code (VScode)支持哪些编程语言
  5. VC6.0连接数据库,并把大量数据从ACCess转移到SQL sever2008 的问题(亲测可用)
  6. 画原理图和PCB图该注意什么?
  7. db设计专用excel_注塑模具设计与加工解决方案
  8. 利用qq账号查询所绑定的手机号码_如何更改社保绑定手机号?
  9. 分布式的信息处理需要利用计算机的,计算机应用基础(离线作业1)
  10. android web 打印,Android设备WebView打印Console Log