【[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 ...
随机推荐
- 时间格式转换成JUN.13,2017
SimpleDateFormat sdf = new SimpleDateFormat("MMM.dd,yyyy", Locale.ENGLISH); String negotia ...
- JS获取当前屏幕宽高
Javascript: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.b ...
- C# 请求Https
/// <summary> /// Get请求 /// </summary> /// <param name="Url"></param& ...
- java设计模式-----3、抽象工厂模式
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创 ...
- MySQL之多表查询练习
一.表格 表一 emp 表二 dept 表三 salgrade; 表四 年度利润表 二.习题 1. 查出至少有一个员工的部门.显示部门编号.部门名称.部门位置.部门人数. 2. 列出所有员工的姓名及 ...
- css常见的快捷开发代码汇总(长期更新)
http://caibaojian.com/popular-css-snippets.html
- php备注
一.关于OOP 1.PHP目前不支持方法重载
- 关于webpack 配置文件找不到
运行命令 npm run eject 将配置文件解压出来 如果运行这个命令有错的时候,很可能与 git 有关 这时候,打开项目文件夹,显示所有隐藏的文件夹(工具),如果显示了git 的文件夹 删掉 ...
- Akka - Basis for Distributed Computing
Some concepts as blow: Welcome to Akka, a set of open-source libraries for designing scalable, resil ...
- 中国国内 - 可用API合集
中国国内 - 可用API合集 收录一篇中国国内可用API合集,分享给大家 目录 笔记 出行 词典 电商 地图 电影 即时通讯 开发者网站 快递查询 旅游 社交 视频 天气 团队协作 图片与图像处理 外 ...