luogu P3760 [TJOI2017]异或和
对于每个二进制位考虑有多少区间和这一位上为1
从前往后扫每个前缀和,如果当前这个前缀和某一个二进制位上为1,因为区间和由这个前缀和减去前面的前缀和得来,如果减去了这一位为0的前缀和,那么 减去的前缀和的 比这一位更小的位 组成的数 要小于等于 当前前缀和 比这一位更小的位 组成的数,区间和的这一位才为1,这样子减是不会产生借位的;反之,如果减去了这一位为1的前缀和,那么 减去的前缀和的 比这一位更小的位 组成的数 要大于 当前前缀和 比这一位更小的位 组成的数,产生借位,减出来这一位才为1;如果当前这个前缀和某一个二进制位上为0就反过来
我 打 字 带 空 格
要统计在某个区间内的数的个数,用树状数组救星了
#include<bits/stdc++.h>
#define il inline
#define re register
#define LL long long
#define db double
#define ldb long double
#define eps (1e-7)
using namespace std;
const int N=300000+10;
const LL mod=20021101;
il LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
LL m,g[N];
struct BIT
{
int m,c[(1<<20)+10];
il void init(int mm){m=mm,memset(c,0,sizeof(c));}
il void add(int x,int y){++x;while(x<=m) c[x]+=y,x+=x&(-x);}
il int pre(int x){++x;int an=0;while(x>=1) an+=c[x],x-=x&(-x);return an;}
il int sum(int l,int r){return pre(r)-pre(l-1);}
}a[2];
int main()
{
m=rd();
for(int i=1;i<=m;i++) g[i]=g[i-1]+rd();int a2=0;
a[0].init(g[m]+1),a[1].init(g[m]+1);
for(int j=0;j<20;j++)
{
if((1<<j)>g[m]) break;
int cn=0,ma=(1<<j)-1;
for(int i=0;i<=m;i++)
{
int x=g[i]&ma,y=(g[i]>>j)&1;
cn+=a[y^1].sum(0,x)+a[y].sum(x+1,ma);
a[y].add(x,1);
}
a2^=(cn&1)<<j;
for(int i=0;i<=m;i++)
{
int x=g[i]&ma,y=(g[i]>>j)&1;
a[y].add(x,-1);
}
}
printf("%d\n",a2);
return 0;
}
luogu P3760 [TJOI2017]异或和的更多相关文章
- 洛谷P3760 - [TJOI2017]异或和
Portal Description 给出一个\(n(n\leq10^5)\)的序列\(\{a_n\}(\Sigma a_i\leq10^6)\),求该数列所有连续和的异或和. Solution 线段 ...
- P3760 [TJOI2017]异或和
题目描述 在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的.所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的简单.但今天小明遇到了一个序列和的难题,这个题目不仅 ...
- 【BZOJ4888】[TJOI2017]异或和(树状数组)
[BZOJ4888][TJOI2017]异或和(树状数组) 题面 BZOJ 洛谷 题解 考虑每个位置上的答案,分类讨论这一位是否存在一,值域树状数组维护即可. #include<iostream ...
- 【bzoj4888】: [Tjoi2017]异或和 BIT-乱搞
[bzoj4888]: [Tjoi2017]异或和 题目大意:给定一个序列,求这个序列所有的连续和的异或值.(n<=1e5 ai<=1e6) 想了各种奇怪的方法就是不会做啊啊啊.. Orz ...
- [Luogu] 让我们异或吧
https://www.luogu.org/problemnew/show/P2420 异或满足 A ^ B = B ^ A A ^ A = 0 0 ^ A = A #include <cstd ...
- [TJOI2017]异或和
题目描述 在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的.所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的 简单.但今天小明遇到了一个序列和的难题,这个题目不 ...
- luogu P4735 最大异或和
嘟嘟嘟 省选竟然考了一个可持久化trie,就挑着我不会的考. 话说考场上我确实写了一个trie的做法,只不过一直没调出来然后就只剩暴力分了. 现在想想实在是太蠢了,明明对算法没有把握,却头脑一热在这题 ...
- 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$ ...
随机推荐
- gitlab搭建与配置说明
1. 概述 Gitlab分为社区版和企业版,此次安装的是社区版(gitlab-ce). 2. 准备 本次使用系统为Ubuntu16.04. 3. 安装 添加GitLab仓库,并安装到服务器上(将git ...
- ImportError: cannot import name descriptor_pb2
重新编译protobuf 下载地址:https://github.com/google/protobuf $cd /path/protobuf/python $python setup.py buil ...
- Layui_Tree模块遍历HDFS
注:转载请署名 一.实体 package com.ebd.application.common.Base; import java.util.List; public class HDFSDir { ...
- JavaScript——根据数组中的某个值进行排序
我这里是根据次数进行倒叙,可根据自己情况进行修改 function sortKey(array,key){ return array.sort(function(a,b){ var x = a[key ...
- 理解C语言递归up_and_down
函数调用.理解递归 对于程序,编译器会对其分配一段内存,在逻辑上可以分为代码段,数据段,堆,栈. 代码段:保存程序文本,指令指针EIP就是指向代码段,可读可执行不可写 数据段:保存初始化的全局变量和静 ...
- luogu4269 Snow Boots G (并查集)
对于某个靴子,如果0代表某个格能走,1代表不能走,那么只要连续的1的个数的最大值>=靴子的步长,那这个靴子就不能用. 那么只要对靴子和格子都按深度排个序,然后从大到小来扫一遍(靴子越来越浅,能走 ...
- Java关键字synchronized详解
Java多线程thread互联网制造 synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话 ...
- Windows7 64下搭建Caffe+python接口环境
参考链接: http://www.cnblogs.com/yixuan-xu/p/5858595.html http://www.cnblogs.com/zf-blog/p/6139044.html ...
- echarts3地图如何添加点击事件? 点击地图相应的区域ajax获取并展示本区域省下面所有市的信息
myChart.on('click', function (params) { var city = params.name; loadChart(city); });
- 谨记:new Date()在IOS中的坑
第一次遇到,记录一下 要创建一个指定时间的new Date对象时,通常的做法是: new Date("2018-04-27 11:11");然后就可以根据这个获取年月日等信息 这种 ...