UVALive8518 Sum of xor sum
题目链接:https://vjudge.net/problem/UVALive-8518
题目大意:
给定一个长度为 $N$ 的数字序列 $A$,进行 $Q$ 次询问,每次询问 $[L,R]$,需要回答这个区间内的子序列的所有子序列的异或和之和。
$1 \le N,Q \le 100000$
$0 \le A[i] \le 1000000$
知识点: 前缀和
解题思路:
将序列中的每一个数转成二进制(不超过 $20$ 位),逐位考虑。
根据序列中的数字用二进制表示时在该位上为 $1$ 或 $0$,我们可以用 $20$ 个 $01$ 序列来表示序列 $A$。现在只考虑二进制位中的某一位,其他位做类似处理即可:
先预处理出异或前缀和 $preXOR$(很明显,它是个 $01$ 序列),用 $zero[][i]$ 和 $one[][i]$ 表示在 $[1,i]$ 这个区间中的 $preXOR$ 有多少个 $0$ 和 $1$。然后用 $sum[][i]$ 表示 $[1,i]$ 这个区间的答案。易知 $sum[][i] = sum[][i-1] + (所有以 A[i] 为右边界的子序列对答案的贡献)$,即 $sum[j][i] = sum[j][i-1] + 2^j *(preXOR[j][i]:zero[j][i-1]?one[j][i-1])$,因为只有当左边界的左边一位的异或前缀和和右边界的异或前缀和的异或和为 $1$ 时该区间才对答案有贡献。
查询 $[L,R]$ 的时候,对于第 $j$ 位,对答案的贡献为:$sum[j][R]-sum[j][L-1]-zero[j][L-2]*(one[j][R]-one[j][L-1])*2^j -one[j][L-2]*(zero[j][R]-zero[j][L-1])*2^j$.
后半部分其实是减掉那些左边界在 $[1,L-1]$ 而右边界在 $[L,R]$ 的区间对答案的影响,还是一样的道理: 只有当左边界的左边一位的异或前缀和和右边界的异或前缀和的异或和为 $1$ 时该区间才对答案有贡献。
"为什么是l-2,因为左端点要<=l-1,如果是l-1的话就表示从l开始了。"
AC代码:
#include <bits/stdc++.h>
using namespace std; typedef long long LL;
const int MAXN=+;
const int MOD=1e9+; int A[MAXN];
int preXOR[][MAXN];
LL sum[][MAXN],zero[][MAXN],one[][MAXN];
int main(){
int T;
scanf("%d",&T);
while(T--){
int N,Q;
scanf("%d%d",&N,&Q);
for(int i=;i<=N;i++) scanf("%d",&A[i]);
for(int i=;i<;i++){
preXOR[i][]=;
one[i][]=,zero[i][]=;
for(int j=;j<=N;j++){
if(A[j]&(<<i))
preXOR[i][j]=preXOR[i][j-]^;
else
preXOR[i][j]=preXOR[i][j-];
one[i][j]=one[i][j-],zero[i][j]=zero[i][j-];
if(preXOR[i][j]) one[i][j]++;
else zero[i][j]++;
}
}
for(int i=,now=;i<;i++,now<<=){
sum[i][]=;
for(int j=;j<=N;j++){
sum[i][j]=sum[i][j-];
if(preXOR[i][j])
sum[i][j]=(sum[i][j]+zero[i][j-]*now)%MOD;
else
sum[i][j]=(sum[i][j]+one[i][j-]*now)%MOD;
}
}
while(Q--){
int L,R;
scanf("%d%d",&L,&R);
LL ans=;
for(int i=,now=;i<;i++,now<<=){
ans=(ans+sum[i][R]-sum[i][L-])%MOD;
if(L>=)
ans=(ans-zero[i][L-]*(one[i][R]-one[i][L-])*now%MOD
-one[i][L-]*(zero[i][R]-zero[i][L-])*now%MOD)%MOD;
}
if(ans<) ans+=MOD;
printf("%lld\n",ans);
}
}
return ;
}
UVALive8518 Sum of xor sum的更多相关文章
- HDU 4825 Xor Sum(经典01字典树+贪心)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Total ...
- 字典树-百度之星-Xor Sum
Xor Sum Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包括了N个正整数,随后 Prometheu ...
- HDU 4825 Xor Sum 字典树+位运算
点击打开链接 Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) ...
- 2014百度之星第三题Xor Sum(字典树+异或运算)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Total ...
- Sum of xor
Sum of xor jdoj-2160 题目大意:给你一个n,求1^2^...^n. 注释:$n<=10^{18}$. 想法:第一道异或的题.先来介绍一下什么是异或.a^b表示分别将两个数变成 ...
- Xor Sum 01字典树 hdu4825
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total S ...
- hdu 4825 Xor Sum (01 Trie)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825 题面: Xor Sum Time Limit: 2000/1000 MS (Java/Others) ...
- HDU--4825 Xor Sum (字典树)
题目链接:HDU--4825 Xor Sum mmp sb字典树因为数组开的不够大一直wa 不是报的 re!!! 找了一下午bug 草 把每个数转化成二进制存字典树里面 然后尽量取与x这个位置上不相同 ...
- hdu 4825 Xor Sum trie树
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Proble ...
随机推荐
- 硬纪元AI峰会前瞻:如何才能做好智能家居?用户体验最重要
用户体验不到位,市场就不能说真的发展起来. 可以明显的感觉到,随着人工智能.物联网等技术的发展和应用,我们的生活正在发生翻天覆地的变化,其中感觉最为明显的就是智能家居. 据前瞻产业研究院的数据统计,我 ...
- CF思维联系– Codeforces-990C Bracket Sequences Concatenation Problem(括号匹配+模拟)
ACM思维题训练集合 A bracket sequence is a string containing only characters "(" and ")" ...
- python-CSV格式清洗与转换、CSV格式列变换、CSV格式数据清洗【数据读入的三种方法】【strip、replace、split、join函数的使用】
1)CSV格式清洗与转换 描述 附件是一个CSV格式文件,提取数据进行如下格式转换: (1)按行进行倒序排列: (2)每行数据倒序排 ...
- python-文件字符分布【get()函数与.sort(key=lambda x:x[0],reverse = False)】
文件字符分布 描述 统计附件文件的小写字母a-z的字符分布,即出现a-z字符的数量,并输出结果. ...
- bootstrap 怎么制作好看的表格
bootstrap 怎么制作表格 bootstrap 制作表格带有图文形式.主要知识点有以下几点 第一点肯定是写出一个普通的表格,这一点可以去菜鸟复制它的案例.添加tr和td就可以了 在表格放入图片加 ...
- Taurus.MVC 2.3.2 :WebAPI 文档集成测试功能及附加<%# JS执行功能语法 %>
前言: 前些天有网友提到了那个界面丑陋的SwaggerUI,让我想起了多年前实现的WebAPI文档未完成的功能点,于是,动手了,便有了本文的内容. 开源地址:https://github.com/cy ...
- js和jq的获取焦点失去焦点写法
- 不需要爬虫也能轻松获取 unsplash 上的图片
我经常会使用 unsplash, 这里面的图片非常清爽,我的大多数文章的图片都是在这个网上找的,虽然也有同类型网站,但是用过一段时间以后基本都放弃了,图片质量参差不齐,筛选过程太费劲. 但是 unsp ...
- Polar码快速入门
Polar码快速入门 本科生在学习极化码时,并不是件简单的事情.网上极化码的资料很少,而且基本上都是较难的论文.这篇文章是用来帮你快速入门极化码. Poalr码背景 2015 年,国际电信联盟无线通信 ...
- 【Spark】必须要用CDH版本的Spark?那你是不是需要重新编译?
目录 为什么要重新编译? 步骤 一.下载Spark的源码 二.准备linux环境,安装必须软件 三.解压spark源码,修改配置,准备编译 四.开始编译 为什么要重新编译? 由于我们所有的环境统一使用 ...