考虑单独统计每一位对答案的贡献。
考虑枚举区间右端点i,那么&操作就是往左找第一个0的位置
|操作就是往左找第一个1的位置
^操作就是记一下到i-1的异或和为0/1的个数,转移一下就好了
复杂度O(logwn)O(logwn)O(logwn)

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 1000010
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return x*f;
}
int n,a[N],bin[31];
ll ans1=0,ans2=0,ans3=0;
void solve0(){for(int i=1;i<=n;++i){int res1=a[i],res2=a[i],res3=a[i];ans1+=res1;ans2+=res2;ans3+=res3;for(int j=i+1;j<=n;++j){res1^=a[j];res2&=a[j];res3|=a[j];ans1+=res1*2,ans2+=res2*2,ans3+=res3*2;}}printf("%.3f %.3f %.3f",ans1*1.0/(n*n),ans2*1.0/(n*n),ans3*1.0/(n*n));
}
int main(){
//  freopen("signal.in","r",stdin);n=read();for(int i=1;i<=n;++i) a[i]=read();if(n<=1000){solve0();return 0;}bin[0]=1;for(int i=1;i<=30;++i) bin[i]=bin[i-1]<<1;for(int i=1;i<=n;++i) ans1+=a[i];ans2=ans3=ans1;for(int j=0;j<=30;++j){int res=(a[1]>>j)&1;ll cnt1=0;for(int i=2;i<=n;++i){int x=(a[i]>>j)&1;res^=x;if(res) cnt1++;}ans1+=cnt1*2*bin[j];for(int i=2;i<=n;++i){if(a[i-1]&bin[j]) cnt1=n-i+1-cnt1;if(a[i]&bin[j]) cnt1--;ans1+=(ll)cnt1*2*bin[j];}int r=2;cnt1=0;for(int i=1;i<=n;++i){if(!(a[i]&bin[j])) continue;if(r<=i) r=i+1;while(r<=n&&(a[r]&bin[j])) ++r;cnt1+=r-1-i;}ans2+=cnt1*2*bin[j];r=2;cnt1=0;//0的个数 for(int i=1;i<=n;++i){if(a[i]&bin[j]) continue;if(r<=i) r=i+1;while(r<=n&&!(a[r]&bin[j])) ++r;cnt1+=r-1-i;}cnt1=(ll)n*(n-1)-2*cnt1;ans3+=(ll)cnt1*bin[j];}printf("%.3f %.3f %.3f",ans1*1.0/((ll)n*n),ans2*1.0/((ll)n*n),ans3*1.0/((ll)n*n));return 0;
}

bzoj3054 Rainbow的信号(位运算+瞎搞)相关推荐

  1. [BZOJ3054] Rainbow的信号(考虑位运算 + DP?)

    传送门 BZOJ没数据范围... 其实数据范围是这样的.. 前20%可以直接n^3暴力枚举每个区间 前40%可以考虑每一位,因为所有数每一位都是独立的,而和的期望=期望的和,那么可以枚举每一位,再枚举 ...

  2. java位于算——一个测试搞懂位运算

    说明 我们平时在看JDK源码的过程中会看到开发者会大量的使用移位运算符,那么移位运算是怎么计算的呢?通过下文的测试代码就可以知道了. 测试代码 package com.leo.demo.otherte ...

  3. 一文搞懂 位运算 异或(Java实现)

    提起异或想必很多小伙伴们既熟悉又陌生,熟悉是因为好像在离散数学或者学某个编程语言 时听过这个东西,而陌生呢,则是因为自己平时并没有用过,以至于当在某个场景 (我猜是在看 题解或者某篇博客时)  看到这 ...

  4. 一篇搞定位运算——java位运算详解

    java位运算详解 前言 一.位运算符 &:按位与 |:按位或 ~:按位非 ^:按位异或 <<:左位移运算符 >>:右位移运算符 <<<:无符号右移运 ...

  5. 彻底搞清楚Java的位运算(位实现加减乘除)

    目录 •写在前面 •机器数和机器数的真值 •原码.反码和补码的基础概念和计算方法 原码 反码 补码 •java中的运算符 •不用乘除算乘除 加法 减法 乘法 除法 •写在前面 二进制位运算是最贴近计算 ...

  6. 位运算的那些事(三)位掩码

    位运算的那些事系列: <位运算的那些事(一)搞懂机器码> <位运算的那些事(二)如何位运算> <位运算的那些事(三)位掩码> 前两篇我重点针对位运算基础以及运算过程 ...

  7. 瞎搞系列-超分辨率进程

    原作者连接:https://zhuanlan.zhihu.com/p/31664818 有代码 瞎搞系列-超分辨率进程 超分辨率是指从观测到的低分辨率图像重建出相应的高分辨率图像,在监控设备.卫星图像 ...

  8. 简单瞎搞题 动态规划的优化

    链接:登录-专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 一共有 n个数,第 i 个数是 xi xi 可以取 [li , ri] 中任意的一个值. 设 S=∑xi2S = \sum{{x_ ...

  9. java加减乘除运算代码_从“位运算”炫技到“操作符”,再到逐步理解“群论”...

    由位运算到操作符,再到逐步理解群论 Step by Step for Understanding from Bitwise to Operators, then Group Theory 是否曾经会有 ...

最新文章

  1. (AI、Artificial Intelligence)人工智能概述及分类
  2. Linux进程-命令行参数和环境列表
  3. 微信小程序 setData动态设置数组中的数据
  4. 设置图像的title_【HTML】2 图像标签和属性
  5. Pagination(分页) 从前台到后端总结
  6. 11.Pipelines
  7. QTreeWidget的基本操作
  8. ubuntu18安装微信
  9. 采访《以魂为中心的领导力》作者之问答
  10. 树莓派3B wiringPi 控制LED小灯
  11. java 实现类似spring的可配置的AOP框架
  12. 方维系统登陆弹窗,登陆后自动刷新当前页的实现方法
  13. Android View onVisibilityChanged onAttachedToWindow onDetachedFromWindow
  14. 【SEW-伺服电机-Profinet-io通讯控制——伺服配置】
  15. origin柱状图坐标标签_origin菜鸟求助。如何做横坐标连续(如下图)的柱状图?...
  16. 生物信息百Jia软件(十七):flash
  17. java page 分页_java Page分页显示
  18. 1万元的台式计算机,买电脑不差钱 万元起步台式机大汇总
  19. 项目型ERP系统哪家做得好?
  20. 使用Vienna RNA进行RNA二级结构预测

热门文章

  1. Google Analytics Measurement Protocol添加自定义统计事件
  2. 误删回收站文件怎么恢复?小技巧来啦!
  3. TOEIC Speak 真题
  4. 科学计算机怎么反用lglg,我的计算机使用LG显示器. 在哪里可以恢复出厂设置. 找不到吗?...
  5. ForkJoinPool的理解
  6. 【学习总结】VIO初始化学习1:Monocular Visual–Inertial State Estimation With Online Initialization and Camera–IMU
  7. 一些鲜为人知却非常实用的数据结构 - Haippy
  8. 《新概念英语》英语的学习方法(完整版)
  9. comsol-超导线1
  10. HDU 1569 最大点权独立集