【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的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...
随机推荐
- MonoDevelop Assembly Browser
[MonoDevelop Assembly Browser] View -> Assembly Browser,通过此窗口可以查看Dll的反编译后的代码. 还有几款免费的替代产品可以使用, 虽然 ...
- Flat Shading
[Flat Shading] Per-vertex渲染技术是针对每个顶点进行渲染计算,然后把计算得到的颜色值和这个顶点关联起来.然后在多边形的面上进行颜色插值以后的平滑的渲染效果.这也叫做Gourau ...
- Excel VBA入门(二)数组和字典
数组和字典也是VBA的常用到数据类型之一.但是我翻了有四五本VBA教程相关的书,里面都没有介绍到字典,数组到是在介绍数据类型时有介绍,而并没有提到字典. 事实上,字典不是VBA内置的类型,它是Wind ...
- 29-中国剩余定理CRT
https://blog.csdn.net/u010468553/article/details/38346195 中国剩余定理[数论] 2014年08月02日 12:55:59 阅读数:2351 中 ...
- C#中读写配置参数文件(利用Windows的API)
读配置文件与写配置文件的核心代码如下: [DllImport("kernel32")] // 读配置文件方法的6个参数:所在的分区(section).键值. 初始缺省值. ...
- lintcode-单例
单例 是最为最常见的设计模式之一.对于任何时刻,如果某个类只存在且最多存在一个具体的实例,那么我们称这种设计模式为单例.例如,对于 class Mouse (不是动物的mouse哦),我们应将其设计为 ...
- 重定向和请求转发后面加“return;”语句
请求转发 RequestDispatcher 重定向 Redirect 代码的执行: 无论是 request.getRequestDispatcher(path).forward(reque ...
- windows server2012安装jdk时报错误代码1603
解决方法:在控制面板中将其卸载,把jdk8换成jdk7就可以安装上了
- iframe是怎么跳转的
在main.jsp中 <iframe frameborder="0" marginheight="0" marginwidth="0" ...
- HDU 6162 Ch’s gift (线段树+树链剖分)
题意:给定上一棵树,每个树的结点有一个权值,有 m 个询问,每次询问 s, t , a, b,问你从 s 到 t 这条路上,权值在 a 和 b 之间的和.(闭区间). 析:很明显的树链剖分,但是要用 ...