【bzoj4888】: [Tjoi2017]异或和 BIT-乱搞
题目大意:给定一个序列,求这个序列所有的连续和的异或值。(n<=1e5 ai<=1e6)
想了各种奇怪的方法就是不会做啊啊啊。。
Orz 参考了一下http://www.cnblogs.com/xiejiadong/p/6815269.html才会做的。。
恩因为不超过20位。。所以可以考虑枚举所有连续和在第i位1的个数
预处理完前缀和就可以O(1)求出任意一个连续和。。
当考虑到第i位的时候,把前缀和扫一遍
当扫到第x个前缀和sum[x],那么所有满足 第y个前缀和sum[y](y<x)的第i位=sum[x] 的第i位 且 sum[x]的i后面的位<sum[y]的i后面的位
或 第y个前缀和sum[y](y<x)的第i位!=sum[x] 的第i位 且 sum[x]的i后面的位>sum[y]的i后面的位
的sum[x]-sum[y]一定是一个对第i位有贡献的连续和。。
理解了半天。。手玩了几个数才明白。。在扫一遍的时候用BIT维护一下就好了。。
/* http://www.cnblogs.com/karl07/ */
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; #define lowbit(x) (x&-x)
const int N=1e5+;
const int MX=1e6+1e5;
int n,m;
int a[N],b[][MX],as[]; int bt(int x,int y){
return (x>>(y-))&;
} void PR(int x){
if (x) PR(x>>);
printf("%d",x&);
}
void pr(int x){
PR (x);
puts("");
} int query(int p1,int x){
int ans=;
while (x){
ans+=b[p1][x];
x-=lowbit(x);
}
return ans;
} void modify(int p1,int x){
while (x<=MX){
b[p1][x]++;
x+=lowbit(x);
}
} int main(){
scanf("%d",&n);
for (int i=;i<=n;i++){
scanf("%d",&a[i]);
a[i]+=a[i-];
}
for (int i=,ba=;i<=;i++){
memset(b,,sizeof(b));
for (int j=;j<=n;j++){
as[i]+=query(bt(a[j],i),ba+)-query(bt(a[j],i),a[j]%ba+)+query(!bt(a[j],i),a[j]%ba+)+bt(a[j],i);
modify(bt(a[j],i),a[j]%ba+);
}
ba=ba*;
}
int ans=;
for (int i=,ba=;i<=;i++,ba*=) ans+=(as[i]&)*ba;
printf("%d\n",ans);
return ;
}
【bzoj4888】: [Tjoi2017]异或和 BIT-乱搞的更多相关文章
- BZOJ4888 [Tjoi2017]异或和 【树状数组】
题目链接 BZOJ4888 题解 要求所有连续异或和,转化为任意两个前缀和相减 要求最后的异或和,转化为求每一位\(1\)的出现次数 所以我们只需要对每一个\(i\)快速求出\(sum[i] - su ...
- BZOJ4888 Tjoi2017异或和(树状数组)
化为前缀和相减.考虑每一位的贡献.则需要快速查询之前有几个数和当前数的差在第k位上为1.显然其与更高位是无关的.于是用BIT维护后k位的数的出现次数,瞎算一算即可. // luogu-judger-e ...
- [BZOJ4888][TJOI2017]异或和(树状数组)
题目描述 在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的.所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的简单.但今天小明遇到了一个序列和的难题,这个题目不仅 ...
- BZOJ4888 [Tjoi2017]异或和 FFT或树状数组+二进制拆位
题面 戳这里 简要题解 做法一 因为所有数的和才100w,所以我们可以直接求出所有区间和. 直接把前缀和存到一个权值数组,再倒着存一遍,大力卷积一波. 这样做在bzoj目前还过不了,但是luogu开O ...
- 【BZOJ4888】[TJOI2017]异或和(树状数组)
[BZOJ4888][TJOI2017]异或和(树状数组) 题面 BZOJ 洛谷 题解 考虑每个位置上的答案,分类讨论这一位是否存在一,值域树状数组维护即可. #include<iostream ...
- 【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞
3578: GTY的人类基因组计划2 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 367 Solved: 159[Submit][Status][ ...
- 【bzoj5108】[CodePlus2017]可做题 拆位+乱搞
题目描述 给出一个长度为 $m$ 的序列 $a$ ,编号为 $a_1\sim a_m$,其中 $n$ 个位置的数已经确定,剩下的位置的数可以任意指定.现在令 $b$ 表示 $a$ 的前缀异或和,求 $ ...
- URAL 1827 Indigenous Wars(排序、乱搞)
题意:给一个长度为n数组{a[i]}.有m个操作Ti,Si,Li表示找以Ti值结束,以Si值开始,长度为Li的连续子串.找到后,将区间的答案值设为1.一开始答案值全部为0.最后输出n个答案值. 好久没 ...
- UVA 11853 [dfs乱搞]
/* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...
随机推荐
- maven如何引入servlet-api和jsp-api
废话不多说,直接上代码 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax. ...
- pycharm打开脚本报错Gtk-Message: Failed to load module "canberra-gtk-module"
解决方法 sudo apt-get install libcanberra-gtk-module
- Blending
[Blending] Blending is used to make transparent objects. When graphics are rendered, after all shade ...
- Android开发实战之拥有Material Design风格的折叠布局
关于折叠布局,也许你并不陌生,最新版的陌陌,或者一些其他的社交APP都有一个折叠布局.折叠布局,让我们的APP更加具有交互性,同时也更加美观,先来展示一下效果图: 这是我个人做的一个APP主界面,可以 ...
- 待解决:2bootstrap-cerulean.css Failed to load resource: the server responded with a status of 404 ()
2bootstrap-cerulean.css Failed to load resource: the server responded with a status of 404 ()
- Qt5.11参考文档
Qt5.11参考文档: http://www.bim-times.com/qt/Qt-5.11.1/qtdoc/index.html (来源于Qt官网)
- 关于《Spark快速大数据分析》运行例子遇到的报错及解决
一.描述 在书中第二章,有一个例子,构建完之后,运行: ${SPARK_HOME}/bin/spark-submit --class com.oreilly.learningsparkexamples ...
- echo $[1 + 2] shell中 $[] 在bash中同$(()),用于算术计算
shell脚本编写:echo $[ 11#8+1] 输出结果是几,为什么,怎么算来的? 摘自:https://zhidao.baidu.com/question/334766451.html 结 ...
- JS中立即执行函数的理解
1.匿名函数不能单独定义,必须进行赋值操作或者立即执行,否则会被JS引擎定义为语法错误 function(){alert(dada);} VM229:1 Uncaught SyntaxError: U ...
- 兼容低于IE9不支持html5标签的元素的方法
方法一: <!--[if lt IE9]> <script> (function() { if (! /*@cc_on!@*/ 0) retur ...