传送门

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?)的更多相关文章

  1. $CH$3801 $Rainbow$的信号 期望+位运算

    正解:位运算 解题报告: 传送门! 其实就是个位运算,,,只是顺便加了个期望的知识点$so$期望的帕并不难来着$QwQ$ 先把期望的皮扒了,就直接分类讨论下,不难发现,答案分为两个部分 $\left\ ...

  2. 【洛谷 P4934】 礼物 (位运算+DP)

    题目链接 位运算+\(DP\)=状压\(DP\)?(雾 \(a\&b>=min(a,b)\)在集合的意义上就是\(a\subseteq b\) 所以对每个数的子集向子集连一条边,然后答案 ...

  3. bzoj5108 [CodePlus2017]可做题 位运算dp+离散

    [CodePlus2017]可做题 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 87  Solved: 63[Submit][Status][Dis ...

  4. 【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 ...

  5. 2019 ICPC Asia Nanchang Regional C And and Pair 找规律/位运算/dp

    题意: 给定一个二进制表示的n,让你找满足如下要求的数对(i,j)的个数 $0 \leqslant j \leqslant i \leqslant n$ $ i & n = i $ $ i & ...

  6. 51nod 1406 位运算/dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1406 1406 与查询 题目来源: CodeForces 基准时间限制: ...

  7. 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 ...

  8. 【BZOJ4300】绝世好题(位运算水题)

    点此看题面 大致题意: 给你一个序列\(a\),让你求出最长的一个子序列\(b\)满足\(b_i\&b_{i-1}!=0\). 位运算+\(DP\) 考虑设\(f_i\)表示以第\(i\)个数 ...

  9. HDU 4949 Light(插头dp、位运算)

    比赛的时候没看题,赛后看题觉得比赛看到应该可以敲的,敲了之后发现还真就会卡题.. 因为写完之后,无限TLE... 直到后来用位运算代替了我插头dp常用的decode.encode.shift三个函数以 ...

随机推荐

  1. Android.mk模板

    此文列出Android.mk的常用模板(部分内容源于多篇他人博客,这里不具体指出),如有错漏,还请在评论中指出,后期持续更新   #链接第三方动态库,在和部分android源码的编译中验证不过 LOC ...

  2. 异步 BeginInvoke

    委托的异步调用异步多线程的三大特点:1.同步方法卡界面,原因是主线程被占用:异步方法不卡界面,原因是计算交给了别的线程,主线程空闲2.同步方法慢,原因是只有一个线程计算:异步方法快,原因是多个线程同事 ...

  3. PHP高端课程

    关于目后佐道IT教育 http://www.cnblogs.com/itpua/p/7710917.html 目后佐道IT教育的师资团队 http://www.cnblogs.com/itpua/p/ ...

  4. Maven归纳

      一.常用功能 1.Maven的中央仓库 https://mvnrepository.com/ 2.添加jar包依赖 1.首先点击pom.xml,然后点击弹出页面中的Dependencies选项,接 ...

  5. Gersgorin 圆盘

    将学习到什么 好多.   Gersgorin 圆盘定理   对任何 \(A \in M_n\),我们总可以记 \(A=D+B\),其中 \(D=\mathrm{diag}(a_{11},\cdots, ...

  6. angstromctf -No libc for You

    0x00 syscall syscall函数原型为: int syscall(int number, ...) 其中number是系统调用号,number后面应顺序接上该系统调用的所有参数.大概意思是 ...

  7. java socket domain name 使用域名.

    java 的 socket 依赖了 nameService.  引擎模式. 使得 socket tcp 层 具有了上层业务的能力 (应用层) Socket socket=new Socket(&quo ...

  8. C++高精度乘法

    #include <cstdio> #include <iostream> #include <algorithm> void highPrecision (int ...

  9. 【OS_Linux】Linux下软件的安装与卸载

    1.Linux中软件安装包的分类 1) 一类是可执行的软件包,无需编译直接安装.在Windows中所有的软件包都是这种类型.安装完这个程序后,你就可以使用,但你看不到源程序.而且下载时要注意这个软件是 ...

  10. ES5中新增的forEach等新方法的一些使用声明

    转载地址:http://www.zhangxinxu.com/wordpress/?p=3220 一.前言-索引 ES5中新增的不少东西,了解之对我们写JavaScript会有不少帮助,比如数组这块, ...