Typesetting math: 100%
长存|

xixike

园龄:4年11个月粉丝:40关注:20

2021-09-25 23:46阅读: 48评论: 0推荐: 0

#61. 连续段的期望

Description

内部题目,不放链接了。

Solution

emm乍一看,感觉一点思路都没有。orand 的期望怎么算啊?xor 的期望又怎么算錒?

我们发现数字的每一位是互不干扰的,那就可以对于每一位分别处理。

然后对于 orandxor 分别计算一下每一位前缀能凑出多少个不同的有贡献区间。

Code

#include <iostream>
#include <cstdio>
#include <algorithm>
#define ll long long

using namespace std;

const int N = 1e5 + 10;
int n;
ll l1, l2, l3, sum;
int a[N], f1[N][35], f2[N][35], f3[N][35];
//f1:xor	f2:and		f3:or

int main(){
	scanf("%d", &n);
	for(int i = 1; i <= n; i++){
		scanf("%d", &a[i]);
		sum += a[i];
	}
	for(int i = 1; i <= n; i++)
		for(int j = 0; j < 31; j++){
			if((a[i] >> j) & 1) f1[i][j] = (i - 1 - f1[i - 1][j]) + 1, f2[i][j] = f2[i - 1][j] + 1, f3[i][j] = i;
			else f1[i][j] = f1[i - 1][j], f2[i][j] = 0, f3[i][j] = f3[i - 1][j];
			l1 += (1ll << j) * f1[i][j];
			l2 += (1ll << j) * f2[i][j];
			l3 += (1ll << j) * f3[i][j];
		}
	l1 = (l1 << 1) - sum;//区间可以反过来,i~i的区间被多算了一遍
	l2 = (l2 << 1) - sum;
	l3 = (l3 << 1) - sum;
	printf("%.3f %.3f %.3f\n", (double)(l1) / n / n, (double)(l2) / n / n, (double)(l3) / n / n);
	return 0;
}

End

本文作者:xixike

本文链接:https://www.cnblogs.com/xixike/p/15336122.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   xixike  阅读(48)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· 开发者新选择:用DeepSeek实现Cursor级智能编程的免费方案
· 【译】.NET 升级助手现在支持升级到集中式包管理
· 独立开发经验谈:如何通过 Docker 让潜在客户快速体验你的系统
· Tinyfox 发生重大改版
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起