洛谷P3760异或和
传送门啦
传送门啦
一般这种位运算的题都要把每一位拆开来看,因为位运算每个位的结果这和这一位的数有关。
这样我们用s[i]表示a的前缀和,即 $ a[1]+a[2]+....a[i] $ ,然后我们从这些数二进制最右位 $ 2^0 $ 开始,按照每一位对答案的贡献来计算。
假设我们现在算到最右位 $ 2^0 $ ,并且位于第i个数,我们想要知道以i结尾的连续和对答案的贡献,只需要知道有多少 $ s[i]-s[j](0<=j<i)$ 的 $ 2^0 $ 位是1。 (设s[0]=0)
如果这个数是奇数,就说明异或了1奇数次,也就相当于异或了1,我们只需要把记录这一位总的异或贡献的变量 $ cnt $ 异或1即可;
如果是偶数就不用管了,对答案没有贡献。
对于数的每一位如果最后 $ cnt=1 $ 的话,就说明在这一位所有连续和的异或和为1,我们就需要把答案加上(1<<(这个位数))。
那如何快速计算有多少个 $ s[i]-s[j] $ 的二进制第k位是否为1呢??
答案是利用权值树状数组。
考虑到 $ \sum a $ 最大才有1000000,我们构造两棵权值树状数组,一棵记录当前位为1的,另一棵记录为0的。
如果当前扫描到的 $ s[i] $ 的二进制第k位为1,那么对这一位的答案有贡献的只有那些第k位为1且第k位向右的数比 $ s[i] $ 第k位向右的数大的或者第k位为0且第k位向右的数不比 $ s[i] $ 第k位向右的数大的。
因为如果第k位都为1的话,那么只有后面那些位的和大于s[i]的数, $ s[i] $ 减去它之后第k位才能出现1(因为s[i]比它小的话需要向更高位借数,就和小学学的横式减法差不多),从而对答案作出贡献;
如果第k位为0的话,如果后面再比 $ s[i] $ 大的话, $ s[i] $ 第k位的1就需要借给低一位的了,所以后面必须不比 $ s[i] $ 大。
这样就很好用权值树状数组维护了。。。。
include
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define max(a,b) (a)>(b)?(a):(b)
using namespace std;
const int maxn = 1e6 + 4;
inline int read() {
char ch = getchar();
int f = 1 , x = 0;
while(ch > '9' || ch < '0') {
if(ch == '-')f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3) + ch - '0';
ch = getchar();
}
return x * f;
}
ll s[maxn],a[maxn];
ll f[2][maxn],n,m,ans=0,now,cnt=0,tmp;
bool flag;
ll maxx;
inline int lowbit(int x){return x & (-x);}
inline void update(ll x,ll y) {
for(; x<=1000000; x+=lowbit(x))
f[y][x]++;
}
inline ll query(ll x,ll y) {
ll ansd = 0;
for(; x; x-=lowbit(x))
ansd += f[y][x];
return ansd;
}
int main() {
n = read();
for(ll i=1; i<=n; i++){
s[i] = read();
s[i] += s[i - 1];
maxx = max(maxx , s[i]);
}
for(ll i=0; i<=20; i++) {
if((1 << i) > maxn) break;
memset(f , 0 , sizeof(f));
flag = 0 , cnt = 0;
update(1 , 0);
for(ll j=1; j<=n; j++) {
tmp = s[j] & (1 << i);
if(tmp) now = query(a[j] + 1 , 0) + query(1000000 , 1) - query(a[j] + 1 , 1);
else now = query(a[j] + 1 , 1) + query(1000000 , 0) - query(a[j] + 1 , 0);
if(now % 2 ) cnt ^= 1;
update(a[j] + 1 , (tmp > 0 ? 1 : 0));
a[j] |= tmp;
}
if(cnt) ans += (1 << i);
}
cout<<ans;
return 0;
}
洛谷P3760异或和的更多相关文章
- 洛谷 P3908 异或之和
洛谷 P3908 异或之和 题目描述 求1⨁2⨁⋯⨁N 的值. A⨁B 即 AA, B 按位异或. 输入输出格式 输入格式: 1 个整数 N . 输出格式: 1 个整数,表示所求的值. 输入输出样例 ...
- 洛谷P3760 - [TJOI2017]异或和
Portal Description 给出一个\(n(n\leq10^5)\)的序列\(\{a_n\}(\Sigma a_i\leq10^6)\),求该数列所有连续和的异或和. Solution 线段 ...
- 洛谷——P3909 异或之积
P3909 异或之积 题目描述 对于A_1,A_2,A_3,\cdots,A_NA1,A2,A3,⋯,AN,求 (6\times \sum_{i=1}^N\sum_{j=i+1}^N\sum_ ...
- 洛谷——P3908 异或之和
P3908 异或之和 题目描述 求1 \bigoplus 2 \bigoplus\cdots\bigoplus N1⨁2⨁⋯⨁N 的值. A \bigoplus BA⨁B 即AA , BB 按位异或. ...
- 洛谷—— P3908 异或之和
https://www.luogu.org/problemnew/show/P3908 题目描述 求1 \bigoplus 2 \bigoplus\cdots\bigoplus N1⨁2⨁⋯⨁N 的值 ...
- 洛谷 P3909 异或之积 题解
原题链接 本人看了其它解法,发现本人的解法还是 首创 ! 而且我的解法好像和 \(\times 6\) 没什么关系 -- (如果没 \(\times 6\),我没还不用算逆元) 别人的思路呢,大都是从 ...
- 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)
LOJ 洛谷 考场上都拍上了,8:50才发现我读错了题=-= 两天都读错题...醉惹... \(Solution1\) 先求一遍前缀异或和. 假设左端点是\(i\),那么我们要在\([i,n]\)中找 ...
- 「洛谷5283」「LOJ3048」「十二省联考2019」异或粽子【可持久化01trie+优先队列】
题目链接 [洛谷传送门] [LOJ传送门] 题目大意 让你求区间异或和前\(k\)大的异或和的和. 正解 这道题目是Blue sky大佬教我做的(祝贺bluesky大佬进HA省A队) 我们做过某一些题 ...
- ⌈洛谷4735⌋⌈BZOJ3261⌋最大异或和【可持久化01Trie】
题目链接 [BZOJ传送门] [洛谷传送门] 题解 终于学会了可持久化trie树了.感觉并不是特别的难. 因为可持久化,那么我们就考虑动态开点的trie树. 都知道异或操作是有传递性的,那么我们就维护 ...
随机推荐
- 前端学习 -- Css -- 伪元素
:first-letter 表示第一个字符 :first-line 表示文字的第一行 :before 选中元素的最前边,一般该伪类都会结合content一起使用,通过content可以向指定位置添加内 ...
- 模拟器下的虚拟sd卡添加文件
1.若出现mkdir failed for myData Read-only file system,在执行 adb shell 命令后,执行mount -o remount ,rw / (去除文件的 ...
- RabbitMQ 相关概念
RabbitMQ 整体上是一个生产者与消费者模型,主要负责接收.存储和转发消息.可以把消息传递的过程想象成:当你讲一个包裹送到邮局,邮局会暂存并最终将邮件通过邮递员送到收件人的手上,RabbitMQ ...
- poj 3415 后缀数组 两个字符串中长度不小于 k 的公共子串的个数
Common Substrings Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 11469 Accepted: 379 ...
- Java入门:MyEclipse安装与破解教程
MyEclipse Pro 2014 GA的安装过程请参考网页:http://blog.my-eclipse.cn/myeclipse-2014-download-and-install.html 安 ...
- Java入门:JDK与Eclipse之类的集成开发工具的关系
JDK是Java Development Kit,也就是说Java开发所需的工具包.有了这个东西,一切Java开发理论上都不是问题了.当然,根据你下载的版本不同,可能擅长的领域不同.通常大家都是用JD ...
- 报错laravel/horizon v1.4.3 requires ext-pcntl * -> the requested PHP extension pcntl is missing from your system.的解决办法
执行composer install后报以下错误: Problem 1 - laravel/horizon v1.4.3 requires ext-pcntl * -> the requeste ...
- K8S调度之标签选择器
Kubernetes 调度简介 除了让 kubernetes 集群调度器自动为 pod 资源选择某个节点(默认调度考虑的是资源足够,并且 load 尽量平均),有些情况我们希望能更多地控制 pod 应 ...
- openssl md5 sha256 rsa des
原文地址找不到了 #include <windows.h>#include <iostream>#include <cassert> #include <st ...
- UIView的alpha属性和hidden属性
alpha 属性为0.0时视图完全透明,为1.0时视图完全不透明. hidden属性为YES时视图隐藏,否则不隐藏. 注意事项: 1 当视图完全透明或者隐藏时,不能响应触摸消息. 也就是alpha等于 ...