#61. 连续段的期望
Description
内部题目,不放链接了。
Solution
emm乍一看,感觉一点思路都没有。, 的期望怎么算啊? 的期望又怎么算錒?
我们发现数字的每一位是互不干扰的,那就可以对于每一位分别处理。
然后对于 ,, 分别计算一下每一位前缀能凑出多少个不同的有贡献区间。
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 中国大陆许可协议进行许可。
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· 开发者新选择:用DeepSeek实现Cursor级智能编程的免费方案
· 【译】.NET 升级助手现在支持升级到集中式包管理
· 独立开发经验谈:如何通过 Docker 让潜在客户快速体验你的系统
· Tinyfox 发生重大改版