连续段的期望

【问题描述】

小N最近学习了位运算,她发现2个数xor之后数的大小可能变大也可能变小,and之后都不会变大,or之后不会变小。于是她想算出以下的期望值:现在有 N个数排成一排,如果她随意选择一对l,r并将下标在l和r中间(包括l,r)的数(xor,and,or)之后,期望得到的值是多少呢?取出每一对l,r 的概率都是相等的。小G认为这太easy了,容易被你们水过去,因此你需要告诉他所有选择情况下,(xor,and,or)值的和。

【输入格式】

第一行1个正整数N。

第二行N个非负整数代表数列。

【输出格式】

共两行六个数。

第一行3个数,分别表示xor的期望,and的期望,or的期望,保留3位小数。

第二行3个数,分别表示xor的和,and的和,or的和。

【输入样例】

2

4 5

【输出样例】

2.750 4.250 4.750

11 17 19

【数据规模】

30%数据中1<=N<=1000

对于另外的30%数据数列中只包含0和1

对于100%的数据1<=N<=100000,数列中的数 <= 10^9

【样例解释】

l, r xor and or

1,1 4 4 4

1,2 1 4 5

2,1 1 4 5

2,2 5 5 5

每一组l,r取的概率都是相同的,xor=(4+1+1+5)/4=2.750 其他同理

【得分说明】

第一行三个数每个数正确得两分。

第二行三个数每个数正确得一分。

第二行三个数全部正确再得一分。

分析

考虑dp。

用\(f(n,31)\)表示以n为右端点的区间中,各个二进制位上的1的个数。

然后就可以很方便的转移。时间复杂度\(O(31n)\)

#include<bits/stdc++.h>
using namespace std;
template<class T>T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
{
data=data*10+ch-'0';
ch=getchar();
}
return x=data*w;
}
typedef long long ll; const int N=1e5+7;
int n,a[N];
int f[N][31];
ll s1,s2,s3; int main(){
freopen("nine.in","r",stdin);
freopen("nine.out","w",stdout);
// cerr<<int(1<<30)<<endl;
read(n);
for(int i=1;i<=n;++i)
read(a[i]);
// xor
for(int i=1;i<=n;++i)
for(int j=0;j<31;++j)
{
if(a[i]>>j&1)
f[i][j]=(i-1-f[i-1][j])+1;
else
f[i][j]=f[i-1][j];
s1+=(1LL<<j)*f[i][j];
// cerr<<i<<" "<<j<<" f="<<f[i][j]<<endl;
}
s1*=2;
for(int i=1;i<=n;++i)
s1-=a[i];
// cerr<<"s1="<<s1<<endl; // and
memset(f,0,sizeof f);
for(int i=1;i<=n;++i)
for(int j=0;j<31;++j)
{
if(a[i]>>j&1)
f[i][j]=f[i-1][j]+1;
else
f[i][j]=0;
s2+=(1LL<<j)*f[i][j];
}
s2*=2;
for(int i=1;i<=n;++i)
s2-=a[i]; // or
memset(f,0,sizeof f);
for(int i=1;i<=n;++i)
for(int j=0;j<31;++j)
{
if(a[i]>>j&1)
f[i][j]=i;
else
f[i][j]=f[i-1][j];
s3+=(1LL<<j)*f[i][j];
}
s3*=2;
for(int i=1;i<=n;++i)
s3-=a[i]; printf("%.3lf %.3lf %.3lf\n",double(s1)/n/n,double(s2)/n/n,double(s3)/n/n);
// printf("%lld %lld %lld\n",s1,s2,s3);
return 0;
}

test20181219 连续段的期望的更多相关文章

  1. 区间的连续段~ST表(模板题)

    链接:https://www.nowcoder.com/acm/contest/82/B来源:牛客网 时间限制:C/C++ 7秒,其他语言14秒 空间限制:C/C++ 262144K,其他语言5242 ...

  2. 牛客82-B:区间的连续段 (ST表,贪心)(WXK牛逼)

    题目描述 给你一个长为n的序列a和一个常数k 有m次询问,每次查询一个区间[l,r]内所有数最少分成多少个连续段,使得每段的和都 <= k 如果这一次查询无解,输出"Chtholly& ...

  3. 牛客练习赛14 B 区间的连续段 (倍增)

    链接:https://ac.nowcoder.com/acm/contest/82/B来源:牛客网 区间的连续段 时间限制:C/C++ 7秒,其他语言14秒 空间限制:C/C++ 262144K,其他 ...

  4. 牛客练习赛14B 区间的连续段

    题目链接 点我跳转 题目大意 给定一个长度为 \(N\) 的序列 \(A\) 和一个常数 \(K\) 有 \(M\) 次询问 每次询问查询一个区间 \([L , R]\) 内所有数最少分成多少个连续段 ...

  5. P2486 [SDOI2011]染色(树剖)区间覆盖+区间的连续段

    https://www.luogu.org/problemnew/show/P2486 值的一看https://www.cnblogs.com/Tony-Double-Sky/p/9283262.ht ...

  6. 【XSY3344】连续段 DP 牛顿迭代 NTT

    题目大意 对于一个长度为 \(n\) 的排列 \(p\),我们称一个区间 \([l,r]\) 是连续的当且仅当 \((\max_{l\leq i\leq r}a_i)-(\min_{l\leq i\l ...

  7. 牛客练习赛9 B - 珂朵莉的值域连续段

    题目描述 珂朵莉给你一个有根树,求有多少个子树满足其内部节点编号在值域上连续 一些数在值域上连续的意思即其在值域上构成一个连续的区间 输入描述: 第一行有一个整数n,表示树的节点数.接下来n–1行,每 ...

  8. codedecision P1112 区间连续段 题解 线段树

    题目描述:https://www.cnblogs.com/problems/p/P1112.html 题目链接:http://codedecision.com/problem/1112 线段树区间操作 ...

  9. P1112 区间连续段

    题目描述 给你一个长度为n的数组 \(a_1, a_2, \dots a_n\) . 一开始这n个元素都为0. 然后有m次操作,每次操作有两种操作类型: update x y a:将区间 \([x,y ...

随机推荐

  1. 手动漏洞挖掘-SQL注入(安全牛笔记)

    substring_index(USER(),"@",l)-- #是将查询出来的结果进行切分,以@符号的方式切分 ’ union select table_name,table_s ...

  2. iOS 那些年我们遇到的坑

    1坑: UITableView的第一个Cell下移

  3. React Native之Fetch简单封装、获取网络状态

    1.Fetch的使用 fetch的使用非常简单,只需传入请求的url fetch('https://facebook.github.io/react-native/movies.json'); 当然是 ...

  4. React-Navigation与Redux整合详解

    本文转自:文章地址:http://blog.csdn.net/u013718120/article/details/72357698 继react-navigation发布已经过去半年的时间,想必Re ...

  5. 第九节课-CNN架构

    2017-08-21 这次的课程比较偏向实际的运用,介绍了当前几种比较主流的CNN网络: 主要是AlexNet,GoogleNet, VGG, ResNet 需要把课后习题做了才能更好的理解.

  6. NO.4 Android开发中常用框架及工具

    android-pulltorefresh 一个强大的拉动刷新开源项目,支持各种控件下拉刷新ListView.ViewPager.WevView.ExpandableListView.GridView ...

  7. java中的char类型所占空间

    java中统一使用unicode编码,所以每个字符都是2个字节16位.unicode包括中文,所以对String类计算长度的时候,一个中文和一个英文都是一个长度.String voice = &quo ...

  8. java JVM 随笔

    先说重点: 对象在堆区 方法在栈区 变量在方法区,常量池在方法区 为什么要了解Java 虚拟机 ? 这个问题一直困惑了我很长一段时间,其实在我们开发的过程中,即使我们不了解JVM也能正常的开发,但是当 ...

  9. 【sparkSQL】创建DataFrame及保存

    首先我们要创建SparkSession val spark = SparkSession.builder() .appName("test") .master("loca ...

  10. canvas操作图片,进行面板画图,旋转等

    HTML5 <canvas> 标签用于绘制图像(通过脚本,通常是 JavaScript). 不过,<canvas> 元素本身并没有绘制能力(它仅仅是图形的容器) - 您必须使用 ...