[BZOJ3054] Rainbow的信号(考虑位运算 + DP?)
BZOJ没数据范围。。。

其实数据范围是这样的。。
前20%可以直接n^3暴力枚举每个区间
前40%可以考虑每一位,因为所有数每一位都是独立的,而和的期望=期望的和,那么可以枚举每一位,再枚举区间,最大 31*n*n
想到枚举每一位也就离正解不远了,可以dp,
对于xor有贡献的是区间xor值为1的区间,那么f[i]表示以i结尾的区间异或值为1的个数,那么xor就很好解决了
对于or,我们只需要找出所有的全为0的区间,拿总区间个数减去就好,
对于and,我们只需要找出所有全为1的区间即可
#include <cstdio>
#include <cstring>
#define N 100005
#define LL long long
#define max(x, y) ((x) > (y) ? (x) : (y)) int p1, p0, mx;
int a[N], f[N];
LL n, num0, num1, cnt;
bool b[N];
double ans1, ans2, ans3;
//f[i]以i结尾的 xor值为1的数量 int main()
{
int i, j, k;
scanf("%lld", &n);
for(i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
mx = max(mx, a[i]);
}
for(k = 0; mx; mx >>= 1, k++);
for(i = 0; i < k; i++)
{
p0 = p1 = -1;
num0 = num1 = cnt = 0;
for(j = 1; j <= n; j++)
{
if(a[j] & (1 << i))
f[j] = j - f[j - 1];
else
f[j] = f[j - 1];
cnt += f[j];
b[j] = (a[j] & (1 << i));
}
for(j = 1; j <= n; j++)
{
if(!b[j] && p0 == -1) p0 = j;
if(b[j] && p0 ^ -1) num0 += (LL)(j - p0) * (j - p0), p0 = -1;
if(b[j] && p1 == -1) p1 = j;
if(!b[j] && p1 ^ -1) num1 += (LL)(j - p1) * (j - p1), p1 = -1;
}
if(p0 ^ -1) num0 += (LL)(j - p0) * (j - p0);
if(p1 ^ -1) num1 += (LL)(j - p1) * (j - p1);
cnt *= 2;
for(j = 1; j <= n; j++)
if(a[j] & (1 << i)) cnt--;
ans1 += 1.0 * (1 << i) * cnt / n / n;
ans2 += 1.0 * (1 << i) * num1 / n / n;
ans3 += 1.0 * (1 << i) * (n * n - num0) / n / n;
}
printf("%.3lf %.3lf %.3lf\n", ans1, ans2, ans3);
return 0;
}
[BZOJ3054] Rainbow的信号(考虑位运算 + DP?)的更多相关文章
- $CH$3801 $Rainbow$的信号 期望+位运算
正解:位运算 解题报告: 传送门! 其实就是个位运算,,,只是顺便加了个期望的知识点$so$期望的帕并不难来着$QwQ$ 先把期望的皮扒了,就直接分类讨论下,不难发现,答案分为两个部分 $\left\ ...
- 【洛谷 P4934】 礼物 (位运算+DP)
题目链接 位运算+\(DP\)=状压\(DP\)?(雾 \(a\&b>=min(a,b)\)在集合的意义上就是\(a\subseteq b\) 所以对每个数的子集向子集连一条边,然后答案 ...
- bzoj5108 [CodePlus2017]可做题 位运算dp+离散
[CodePlus2017]可做题 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 87 Solved: 63[Submit][Status][Dis ...
- 【CF908E】New Year and Entity Enumeration 位运算+DP
[CF908E]New Year and Entity Enumeration 题意:给定$M=2^m-1$,我们称一个集合S是好的,当且仅当它满足:1.$\forall a\in S,a\ \ma ...
- 2019 ICPC Asia Nanchang Regional C And and Pair 找规律/位运算/dp
题意: 给定一个二进制表示的n,让你找满足如下要求的数对(i,j)的个数 $0 \leqslant j \leqslant i \leqslant n$ $ i & n = i $ $ i & ...
- 51nod 1406 位运算/dp
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1406 1406 与查询 题目来源: CodeForces 基准时间限制: ...
- leetcode 201. Bitwise AND of Numbers Range(位运算,dp)
Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers ...
- 【BZOJ4300】绝世好题(位运算水题)
点此看题面 大致题意: 给你一个序列\(a\),让你求出最长的一个子序列\(b\)满足\(b_i\&b_{i-1}!=0\). 位运算+\(DP\) 考虑设\(f_i\)表示以第\(i\)个数 ...
- HDU 4949 Light(插头dp、位运算)
比赛的时候没看题,赛后看题觉得比赛看到应该可以敲的,敲了之后发现还真就会卡题.. 因为写完之后,无限TLE... 直到后来用位运算代替了我插头dp常用的decode.encode.shift三个函数以 ...
随机推荐
- Android.mk模板
此文列出Android.mk的常用模板(部分内容源于多篇他人博客,这里不具体指出),如有错漏,还请在评论中指出,后期持续更新 #链接第三方动态库,在和部分android源码的编译中验证不过 LOC ...
- 异步 BeginInvoke
委托的异步调用异步多线程的三大特点:1.同步方法卡界面,原因是主线程被占用:异步方法不卡界面,原因是计算交给了别的线程,主线程空闲2.同步方法慢,原因是只有一个线程计算:异步方法快,原因是多个线程同事 ...
- PHP高端课程
关于目后佐道IT教育 http://www.cnblogs.com/itpua/p/7710917.html 目后佐道IT教育的师资团队 http://www.cnblogs.com/itpua/p/ ...
- Maven归纳
一.常用功能 1.Maven的中央仓库 https://mvnrepository.com/ 2.添加jar包依赖 1.首先点击pom.xml,然后点击弹出页面中的Dependencies选项,接 ...
- Gersgorin 圆盘
将学习到什么 好多. Gersgorin 圆盘定理 对任何 \(A \in M_n\),我们总可以记 \(A=D+B\),其中 \(D=\mathrm{diag}(a_{11},\cdots, ...
- angstromctf -No libc for You
0x00 syscall syscall函数原型为: int syscall(int number, ...) 其中number是系统调用号,number后面应顺序接上该系统调用的所有参数.大概意思是 ...
- java socket domain name 使用域名.
java 的 socket 依赖了 nameService. 引擎模式. 使得 socket tcp 层 具有了上层业务的能力 (应用层) Socket socket=new Socket(&quo ...
- C++高精度乘法
#include <cstdio> #include <iostream> #include <algorithm> void highPrecision (int ...
- 【OS_Linux】Linux下软件的安装与卸载
1.Linux中软件安装包的分类 1) 一类是可执行的软件包,无需编译直接安装.在Windows中所有的软件包都是这种类型.安装完这个程序后,你就可以使用,但你看不到源程序.而且下载时要注意这个软件是 ...
- ES5中新增的forEach等新方法的一些使用声明
转载地址:http://www.zhangxinxu.com/wordpress/?p=3220 一.前言-索引 ES5中新增的不少东西,了解之对我们写JavaScript会有不少帮助,比如数组这块, ...