【[TJOI2017]异或和】
这道题挺神仙的,毕竟这个异或是需要进位的
看到区间和我们很自然的就想到了前缀和
于是处理一下前缀和答案就变成了这个样子
\]
众所周知异或是应该按位处理的,但是这里是减法,所以还有进位需要处理
瞬间就感觉没有办法处理了
但是还是应该按位处理的,我们应该按位考虑这一位上最后的答案是什么
非常显然的一点是我们在考虑某一位的时候并不需要顾忌更靠前的位置,只需要考虑后面的位置就好了
所以我们按位考虑每一位的答案,用一个权值树状数组维护这个位置后面的数是什么
分情况讨论一下
如果这一位上是\(1\),那么后面的数无论多小都无需向前面的数借位,统计一下后面的数比他小的有多少个\(0\),比它大的有多少个\(1\)就好了
这一位是\(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]异或和】的更多相关文章
- 【BZOJ4888】[TJOI2017]异或和(树状数组)
[BZOJ4888][TJOI2017]异或和(树状数组) 题面 BZOJ 洛谷 题解 考虑每个位置上的答案,分类讨论这一位是否存在一,值域树状数组维护即可. #include<iostream ...
- 【bzoj4888】: [Tjoi2017]异或和 BIT-乱搞
[bzoj4888]: [Tjoi2017]异或和 题目大意:给定一个序列,求这个序列所有的连续和的异或值.(n<=1e5 ai<=1e6) 想了各种奇怪的方法就是不会做啊啊啊.. Orz ...
- 洛谷P3760 - [TJOI2017]异或和
Portal Description 给出一个\(n(n\leq10^5)\)的序列\(\{a_n\}(\Sigma a_i\leq10^6)\),求该数列所有连续和的异或和. Solution 线段 ...
- [TJOI2017]异或和
题目描述 在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的.所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的 简单.但今天小明遇到了一个序列和的难题,这个题目不 ...
- BZOJ.4888.[TJOI2017]异或和(树状数组)
BZOJ 洛谷 \(Description\) 求所有区间和的异或和. \(n\leq 10^5,\ \sum a_i\leq 10^6\). \(Solution\) 这样的题还是要先考虑按位做. ...
- Luogu3760 TJOI2017 异或和 树状数组
传送门 题意:给出一个长度为$N$的非负整数序列,求其中所有连续区间的区间和的异或值.$N \leq 10^5$,所有元素之和$\leq 10^6$ 设序列的前缀和为$s_i$,特殊地,$s_0=0$ ...
- P3760 [TJOI2017]异或和
题目描述 在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的.所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的简单.但今天小明遇到了一个序列和的难题,这个题目不仅 ...
- [BZOJ4888][TJOI2017]异或和(树状数组)
题目描述 在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的.所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的简单.但今天小明遇到了一个序列和的难题,这个题目不仅 ...
- BZOJ4888 [Tjoi2017]异或和 【树状数组】
题目链接 BZOJ4888 题解 要求所有连续异或和,转化为任意两个前缀和相减 要求最后的异或和,转化为求每一位\(1\)的出现次数 所以我们只需要对每一个\(i\)快速求出\(sum[i] - su ...
随机推荐
- PHP项目学习——控件
主要是在项目学习中总结的一些东西 动态效果 flashbar滚动条,增加动态效果,直接嵌入html中 <!--flash滚动条--> <object classid="cl ...
- qq iOS环境配置及调用
1.下载官方iOS sdk:地址:相关文档 2. 将iOS SDK中的TencentOpenAPI.framework和TencentOpenApi_IOS_Bundle.bundle文件拷贝到应用开 ...
- 撩课-Java每天5道面试题第18天
121.描述Struts2的工作原理 客户端发送请求--> 请求经过一系列过滤器-> FilterDispatcher通过 ActionMapper来决定这个Reques t需要调用哪个A ...
- linux端口开放
netstat 查看端口开放情况: netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 ...
- POJ 1006 Biorhythms --中国剩余定理(互质的)
Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 103539 Accepted: 32012 Des ...
- 使用TreeDMS进行MySQL数据库的Web页面远程管理
在互联网应用蓬勃发展的时代背景下,各种各样的网络平台,网络应用,移动应用层出不穷,那么这些应用及平台都需要使用到数据库.如何高效的对数据进行日常维护.管理.监控成为迫切需要解决的问题. 基于web的方 ...
- plSql读取Oracle数据库中文乱码
新建环境变量,设置变量名:NLS_LANG,变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK,确定即可
- js函数的节流与防抖
一.防抖&节流 在前端开发中有一部分用户行为会频繁的触发事件执行,而对于DOM的操作.资源加载等耗费性能的处理,很可能会导致界面卡顿,甚至浏览器奔溃.函数的节流与防抖就是为了解决类似需求而产生 ...
- mysql备份整个数据库的表结构和数据
- webstorm git 怎么断开版本控制 webstorm git for windows 禁止 自动运行
也是无语啊,今天装了下最新版本的webstorm , 发现特别卡,老动不动就卡死, 看了下进程, 牛X 啊, git for windows 一直蹭蹭蹭的疯狂增长,一开始的一点到后来的庞然大物. ...