P3760-[TJOI2017]异或和【树状数组】
正题
题目链接:https://www.luogu.com.cn/problem/P3760
题目大意
给出\(n\)个数字的一个序列\(a\),求它所有区间和的异或和
\(n\leq 10^5,\sum a_i\leq 10^6\)
解题思路
开始写了个前缀和\(+FFT\)发现要卡常然后就换了个方法。
每一个位分开考虑,现在要求有多少个区间和的第\(k\)位是\(1\)。
设\(sum\)为区间和,那么为了方便计算我们要把\(and\)操作转换一下。就有\(sum\% 2^{k+1}\in[2^{k},2^{k+1})\)。
看起来好像更复杂了,其实没有,因为\(2^k\)我们可以直接枚举,那么对于模\(2^{k+1}\)次方意义下在\([2^{k},2^{k+1})\)范围内的区间和就符合要求。
这个就是树状数组的活了
时间复杂度\(O(n\log^2 n)\)(反正是\(log\),\(\sum a_i\)算和\(n\)同级得了)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lowbit(x) (x&-x)
using namespace std;
const int N=1<<20;
int n,a[N],t[N],ans,lim;
void Change(int x,int val){
x++;
while(x<=lim){
t[x]+=val;
x+=lowbit(x);
}
return;
}
int Ask(int x){
int ans=0;x++;
while(x){
ans+=t[x];
x-=lowbit(x);
}
return ans;
}
int Query(int l,int r)
{return Ask(r)-Ask(l-1);}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
a[i]+=a[i-1];
}
for(int lg=1;lg<=20;lg++){
lim=(1<<lg);
int k=lim>>1,tmp=0;Change(0,1);
for(int i=1;i<=n;i++){
int w=a[i]%lim;
if(w>=k)tmp+=Query(w+1,lim-1)+Query(0,(w+k)%lim);
else tmp+=Query(w+1,w+k);
Change(w,1);tmp%=2;
}
for(int i=1;i<=n;i++)Change(a[i]%lim,-1);
if(tmp&1)ans|=k;Change(0,-1);
}
printf("%d\n",ans);
}
P3760-[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$ ...
- [BZOJ4888][TJOI2017]异或和(树状数组)
题目描述 在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的.所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的简单.但今天小明遇到了一个序列和的难题,这个题目不仅 ...
- 【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]\)内的所有 ...
- [CSP-S模拟测试]:异或(树状数组+LCA)
题目传送门(内部题21) 输入格式 第一行一个字符串$str$,表示数据类型.第二行一个正整数$k$,表示集合$K$的大小,保证$k>1$.接下来$k$行每行$k$个数,第$i$行第$j$个数表 ...
- 【BZOJ4888】[TJOI2017]异或和(树状数组)
[BZOJ4888][TJOI2017]异或和(树状数组) 题面 BZOJ 洛谷 题解 考虑每个位置上的答案,分类讨论这一位是否存在一,值域树状数组维护即可. #include<iostream ...
- BZOJ4888 [Tjoi2017]异或和 【树状数组】
题目链接 BZOJ4888 题解 要求所有连续异或和,转化为任意两个前缀和相减 要求最后的异或和,转化为求每一位\(1\)的出现次数 所以我们只需要对每一个\(i\)快速求出\(sum[i] - su ...
- BZOJ4888 [Tjoi2017]异或和 FFT或树状数组+二进制拆位
题面 戳这里 简要题解 做法一 因为所有数的和才100w,所以我们可以直接求出所有区间和. 直接把前缀和存到一个权值数组,再倒着存一遍,大力卷积一波. 这样做在bzoj目前还过不了,但是luogu开O ...
随机推荐
- SpringBoot监听redis订阅监听和发布订阅
前言 我们可以在redis中发布一条订阅到通道中,所有监听了这个通道的都可以收到这个发布的内容! redis订阅监听配置类 代码如下: RedisListenerConfig.java package ...
- 使用Postman测试 参数为实体类
Body-->raw-->json
- FileUtils常用方法 - commons-io常用工具类
FileUtils常用常量 public static final long ONE_KB = 1024; public static final BigInteger ONE_KB_BI = Big ...
- JavaWeb之HttpSession
时间:2016-11-17 22:33 --HttpSession一.HttpSession概述 1.HttpSession是由JavaWeb提供的,用来进行会话跟踪的类. 2.sessi ...
- 字节跳动基于Apache Hudi构建EB级数据湖实践
来自字节跳动的管梓越同学一篇关于Apache Hudi在字节跳动推荐系统中EB级数据量实践的分享. 接下来将分为场景需求.设计选型.功能支持.性能调优.未来展望五部分介绍Hudi在字节跳动推荐系统中的 ...
- sparksql字段类型转换
1.spark sql 计算时,一定要注意精度的问题,一般像金额之类的值,要先转换为double或者 decimal来进行计算了. 一.sql的方式:select shop_id,order_id,s ...
- 并发控制--context篇
目录 1. 前言 2 Context 实现原理 2.1 接口定义 2.1 cancelCtx 2.1.1 Done()接口实现 2.1.2 Err()接口实现 2.1.3 cancel()接口实现 2 ...
- 并发编程之:Atomic
大家好,我是小黑,一个在互联网苟且偷生的农民工. 在开始讲今天的内容之前,先问一个问题,使用int类型做加减操作是不是线程安全的呢?比如 i++ ,++i,i=i+1这样的操作在并发情况下是否会有问题 ...
- php常用的函数
addslashes: 字符串加入斜线.bin2hex: 二进位转成十六进位.chop: 去除连续空白.chr: 返回序数值的字符.chunk_split: 将字符串分成小段.convert_cyr_ ...
- php检测数组长度的函数sizeof count
php教程检测数组长度的函数sizeof count在php检测数组长度的函数有sizeof count 下面看个简单实例*/$colorlist = array("apple" ...