BZOJ.4888.[TJOI2017]异或和(树状数组)
\(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]异或和(树状数组)的更多相关文章
- Luogu3760 TJOI2017 异或和 树状数组
传送门 题意:给出一个长度为$N$的非负整数序列,求其中所有连续区间的区间和的异或值.$N \leq 10^5$,所有元素之和$\leq 10^6$ 设序列的前缀和为$s_i$,特殊地,$s_0=0$ ...
- [BZOJ4888][TJOI2017]异或和(树状数组)
题目描述 在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的.所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的简单.但今天小明遇到了一个序列和的难题,这个题目不仅 ...
- BZOJ 4888 [Tjoi2017]异或和
题解:对每一位分别考虑贡献 先求前缀和 按照二进制减法分类讨论,求出最终这一位是1还是0 用树状数组维护 注意:树状数组对0这个位置单独考虑 #include<iostream> #inc ...
- BZOJ 2819: Nim dfs序维护树状数组,倍增
1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家.2.把堆v中的石子数变为k. 分析: ...
- 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[ ...
- bzoj 3730 震波——动态点分治+树状数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3730 查询一个点可以转化为查询点分树上自己到根的路径上每个点对应范围答案.可用树状数组 f ...
- 【Foreign】异色弧 [树状数组]
异色弧 Time Limit: 20 Sec Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample Input 8 1 ...
- P5057 [CQOI2006]简单题 前缀异或差分/树状数组
好思路,好思路... 思路:前缀异或差分 提交:1次 题解:区间修改,单点查询,树状数组,如思路$qwq$ #include<cstdio> #include<iostream> ...
- 洛谷 P6225 [eJOI2019]异或橙子 (树状数组)
题意:有\(n\)个数,起始值均为\(0\),进行\(q\)次操作,每次输入三个数,如果第一个数为\(1\),则将第\(i\)个数修改为\(j\),如果为\(2\),则求区间\([l,r]\)内的所有 ...
随机推荐
- python网络爬虫笔记(二)
一.函数调用的默认设置 1.def enroll(name,grnder,age=4,city='Shanghai'): print (''name:',name) print (''gender', ...
- bzoj1123 割点性质应用
删掉无向图上任意一点,请求出将会增加的不连通的点对数 将无向图联通性的问题转化到搜索树方向上考虑 如果一个点不是割点,那么删掉该点的答案很简单,就是2*(n-1) 如果点u是割点,同时u在搜索树上有t ...
- IP的计算
IP的计算 时间限制: 1 Sec 内存限制: 32 MB 位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如192 ...
- 饮冰三年-人工智能-linux-09 服务
1:SSH服务(提供远程连接服务) 客户端使用Xshell 链接成功 加快连接速度 关闭防火墙 2:apache 服务(提供网页服务) 2.0 准备环境 关闭防火墙:service iptables ...
- linux基础练习题(2)
Linux命令作业(关卡二) 练习题1 理解操作系统的作用,以及各种操作系统的不同 要求: 为什么要有OS?没有OS能行吗?原因是什么? Linux内核指的是什么? Linux主要应用在哪些地方? 使 ...
- MongDb介绍及简单实用
一:介绍 MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值存储方式.Mongo使用C ...
- 最新版谷歌浏览器的Flash设置已经不能保存了?
解决方法:先去chrome实验室界面chrome://flags/#enable-ephemeral-flash-permission选择取消Disabled.取消该实验室选项. 然后去chrome: ...
- 使用Filter跟踪Asp.net MVC页面加载(转)
转载地址:http://www.cnblogs.com/JustRun1983/p/4027929.html 最近,客户一直反馈系统使用慢,有时候能够指出具体是哪个页面,有时候又只是笼统地反馈慢.这种 ...
- noip飞扬的小鸟
题解: 挺简单的题目 f[i][j]表示x坐标为i,y坐标为j的最小值 会发现那个东西是个完全背包 从f[i][j-a[i]]转移一下就是O(1)转移的了 另外上界为m这个要特判一下 我把sum[a[ ...
- kafka其中一台节点坏掉的迁移或者数据迁移
kafka版本:适用于目前2.0以下 第一步: 假如有一个topic叫做test,当前topic的详情是这样的: [cdh@cdh1 kafka_2.11-1.0.1]$ bin/kafka-topi ...