Rainbow的信号
有一串长度为n的数列,现在从中等概率选出l,r,如果l大于r,则交换,有三个询问
- l~r间的数与和的数学期望
- l~r间的数或和的数学期望
- l~r间的数异或和的数学期望
对于100%的数据,1<=n<=100000,n个自然数均不超过10^9。
解
注意到lr,概率为\(1/n^2\),其外概率均为\(2/n^2\),考虑到有固定的概率,考虑公式法,对于lr显然可以暴力做,现在问题在于如何快速求出区间的二进制运算和,注意到二进制不进位的特点,考虑二进制拆分,于是对于所有数的单独的每一二进制位讨论,接着考虑如何维护区间二进制运算。
对于l!=r,于是枚举右端点r,再考虑左端点的情况,记录\(last[x]\)表示当前r左边第一个出现x的位置,显然可以维护,当前二进制位为第k位,数列为a,对于询问
与运算
- a[r]==0:
\]
- a[r]==1:
\]
或运算
- a[r]==0:
\]
- a[r]==1:
\]
异或运算
注意到异或类似与奇偶的性质,于是设c1,c2分别为从r向右数的以1开头的奇数段,偶数段的长度,举个例子
00001 0001 000
00001 0001 0001
例子中标黑色的段为奇数段,其余为偶数段,r为最后一个数字
于是我们有
- a[r]==0:
\]
- a[r]==1:
\]
不难得知时间复杂度应为\(O(nlog(n))\)
参考代码:
#include <iostream>
#include <cstdio>
#define il inline
#define ri register
#define lb long double
#define swap(x,y) x^=y^=x^=y
using namespace std;
lb ans1,ans2,ans3,n1,n2;
int num[100001],last[2],c1,c2;
il void read(int&);
int main(){
int n,i,j,sxr;read(n),n2=2/((lb)n*n),n1=n2/2;
for(i=1;i<=n;++i)read(num[i]);
for(i=0,sxr=1;i<31;++i,sxr<<=1)
for(j=1,last[0]=last[1]=c1=c2=0;j<=n;num[j]>>=1,++j)
if(num[j]&1)ans1+=c2*n2*sxr+n1*sxr,ans2+=(j-1-last[0])*n2*sxr+n1*sxr,
ans3+=(j-1)*n2*sxr+n1*sxr,last[1]=j,swap(c1,c2),++c1;
else ans1+=c1*n2*sxr,ans3+=last[1]*n2*sxr,last[0]=j,++c2;
printf("%.3Lf %.3Lf %.3Lf",ans1,ans2,ans3);
return 0;
}
il void read(int &x){
x&=0;ri char c;while(c=getchar(),c<'0'||c>'9');
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
}
Rainbow的信号的更多相关文章
- tyvj 2020 rainbow 的信号
期望 被精度坑惨的我 注意:能开 long long 尽量开, 先除后乘, int 转 double 的时候 先转换在做运算 本题与位运算有关,位与位之间互不影响,所以我们可以分开考虑 #includ ...
- joyoi2020/lfyzoj114 Rainbow 的信号
位与位间互不影响.一位一位计算. 长度为 \(1\) 的区间,选出概率为 \(1/n^2\).其余区间,选出概率为 \(2/n^2\).(这里的区间 \(l \leq r\)) 枚举右端点.记 \(l ...
- [BZOJ3054] Rainbow的信号(考虑位运算 + DP?)
传送门 BZOJ没数据范围... 其实数据范围是这样的.. 前20%可以直接n^3暴力枚举每个区间 前40%可以考虑每一位,因为所有数每一位都是独立的,而和的期望=期望的和,那么可以枚举每一位,再枚举 ...
- Rainbow的信号 CH3801
题目链接 题意:求n个整数任意取一个区间,一起进行xor,and,或or的操作,求xor的期望值,and的期望值,or的期望值. 思路:区间取的左端点为l,右端点为r,当r==l时,选的概率为1/n/ ...
- $CH$3801 $Rainbow$的信号 期望+位运算
正解:位运算 解题报告: 传送门! 其实就是个位运算,,,只是顺便加了个期望的知识点$so$期望的帕并不难来着$QwQ$ 先把期望的皮扒了,就直接分类讨论下,不难发现,答案分为两个部分 $\left\ ...
- AcWing 216 Rainbow 的信号
题意 给定一个长度为n的序列,然后从\(1\sim N\) 这 N 个数中选取两个数\(l,r\) , 如果\(l>r\),则交换\(l,r\).把第\(l\) 个数到第\(r\)个数取出来构成 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- CH3801Rainbow的信号
Description Freda发明了传呼机之后,rainbow进一步改进了传呼机发送信息所使用的信号.由于现在是数字.信息时代,rainbow发明的信号用N个自然数表示.为了避免两个人的对话被大坏 ...
- Rainbow: Combining Improvements in Deep Reinforcement Learning
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:1710.02298v1 [cs.AI] 6 Oct 2017 (AAAI 2018) Abstract 深度强化学习社区对D ...
随机推荐
- 2018-06-05(thinking in java)
1:类只能有2种访问权限,一种是不写访问权限:默认包访问权限,另一种是public.且类只能有一个pubic 2:方法有4种访问权限,pubic(都可以访问),protexted(继承访问权限),pr ...
- easyUI tabs 显示与隐藏 tab 页
隐藏: tab_option = $('#tabs').tabs('getTab'," 单位信息 ").panel('options').tab; tab_option.hide( ...
- liunx crontab 参数代表含义
* * * * * (下面的字体对应) 分钟 小时 几号 月份 星期几 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作. 逗号(,): ...
- Python骚操作(一)
1. 交换变量值 2. 将列表中所有元素组合成字符串 3. 查找列表中频率最高的值 4. 检查连个字符串是不是由相同字母不同顺序组成 5. 反转字符串 6. 反转列表 7. 转置二维数组 8. 链式比 ...
- ios position:fixed 上滑下拉抖动
ios position:fixed 上滑下拉抖动 最近呢遇到一个ios的兼容问题,界面是需要一个头底部的固定的效果,用的position:fixed定位布局,写完测试发现安卓手机正常的,按时ios上 ...
- 如果json中的key需要首字母大写怎么解决?
一般我们命名都是驼峰式的,可是有时候和第三方接口打交道,也会遇到一些奇葩,比如首字母大写........额 这是个什么鬼,对方这么要求,那我们也得这么写呀. 于是乎,第一种方式:把类中的字段首字母大写 ...
- java 与日期转换相关的方法(java.util.date类型和java.sql.date类型互相转换)、随机字符串生成方法、UUID生产随机字符串
package com.oop.util; import java.text.*; import java.util.UUID; import org.junit.Test; /* * 与日期相关的工 ...
- JS函数 编程练习 使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数。
编程练习 使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数. 任务 第一步: 编写代码完成一个函数的定义吧. 第二步: 我们来补充函数体中的控制语句,完成函数功能吧. 提示: ...
- Vue键盘事件
键盘事件一 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...
- ubuntu切换到root用户
我们都知道使用su root命令,去切换到root权限,此时会提示输入密码,可是怎么也输不对,提示"Authentication failure", 解决办法如下 su root ...