Description

题目链接 懒得写详细题意了, 放个链接

\(n\le 2*10^5\) 个球, \(n+1\) 个坑, 排成数轴, 球坑交替. 相邻球-坑距离为等差数列 \(d\). 给定首项与公差. 每次随机选一个球并随机往一个方向推, 求期望经过距离总和

Solution

手玩观察一下, 球不可能没坑掉, 每次推完一个球后变成 \(n-1\) 个球的子问题.

对于每一个子问题, 只考虑推第一个球的期望距离 (\(\frac{\sum_{i=1}^{2n}d_i}{2n}\)) , 其他的在子问题中处理.

考虑对于任意一个子问题, 假设有 \(n\) 个球, 则有 \(2n\) 个子状态, 每个子状态的概率 \(\frac 1{2n}\)

子状态中 \(d'\) 可根据当前问题的 \(d\) 经过线性运算得出, 推第一个球的期望距离也可由 \(d\) 线性运算得出.

因此, 我们可以将这 \(2n\) 个子问题合并, 合并的子问题中 \(d''_i = E[d'_i]\). 下面观察 \(d''\) :

下面的图中, 记o为球, d为当前子问题的(期望)每段段长, _为坑, 新d''是从左往右标号的.
o o o o 考虑每种球掉落方案, 边界球往边界坑掉 是 特殊情况, 其余:
d1 d2 d3 d4 d5 d6 d7 d8 将相邻的三个d加在一起合成一段, 其他不变. 记段为(l,r)
_ _ _ _ _ 那么l=1..2n-2, 考虑每个di (1<=i<=n) 的贡献

\(l\le i-2\) 时, \(d_i\to d''_{i-2}\). \(l=i-1\) 时, \(d_i\to d''_{i-1}\). \(l\ge i\) 时, \(d_i\to d''_{i}\) , 总的来看就是

\(d''_i = d_i+d_{i+2}+i*d_{i+2}+d_{i+1}+(2n-2-i+1)*d_i=(2n-i)d_i+d_{i+1}+(i+1)d_{i+2}\)

\(=(2n+2)d_0+3\Delta + (2n+4)i\Delta\) , 于是原问题等差, 合并后子问题等差, \(\cdots\), 都等差.

实现很简单

Code

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#define rep(i, a, b) for (int i = (a), _ = (b); i <= _; ++ i)
#define per(i, a, b) for (int i = (a), _ = (b); i >= _; -- i)
#define For(i, a, b) for (int i = (a), _ = (b); i < _; ++ i)
#define ri rd<int>
typedef long double db;
using namespace std; template<class T> inline T rd() {
bool f = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') f = 0;
T x = 0; for (; isdigit(c); c = getchar()) x = x * 10 + c - 48; return f ? x : -x;
} int n;
db d0, delta, ans; inline db calc(db d0, db delta, db len) {
return len * d0 + delta * len * (len + 1) / 2;
} int main() { n = ri(), d0 = ri(), delta = ri(), d0 -= delta;
per (i, n, 1) {
ans += calc(d0, delta, 2 * i) / (2 * i);
d0 = (2 * i + 2) * d0 + 3 * delta;
delta *= (2 * i + 4);
d0 /= 2 * i;
delta /= 2 * i;
} printf("%.15Lf\n", ans); return 0;
}

最新文章

  1. Spring注解
  2. How to debug .NET Core RC2 app with Visual Studio Code on Windows?
  3. Windows 查看端口占用和关闭进程
  4. window.lacation.replace
  5. IIS线程池与ASP.NET线程池
  6. bzoj 1185 旋转卡壳 最小矩形覆盖
  7. easyUI分页显示
  8. POJ 1607
  9. C预处理,条件编译
  10. python+sublime text2中文乱码[Decode error - output not utf-8]
  11. [Algorithm] 如何正确撸&lt;算法导论&gt;CLRS
  12. saltstack二
  13. Python_tuple部分功能介绍
  14. android圆角功能,非常好用,可以用在图片,视频,gif等上面
  15. 对象扩展运算符(…)与rest运算符
  16. [HNOI2012]集合选数 BZOJ2734
  17. WebService中方法的重载
  18. tabs 标签样式
  19. nvarchar,varchar 区别
  20. Uiautomator 快速调试

热门文章

  1. scrapy--matplotlib
  2. java-访问控制修饰符
  3. linux最大进程数
  4. 查找并绘制轮廓 opencv
  5. 36-应用Jwtbearer Authentication
  6. Linux之rsync同步工具介绍+inotify同步
  7. talent-aio源码阅读小记(二)
  8. 树莓派Raspberry Pi 3安装步骤
  9. android什么时候会产生ANR
  10. vue.js中created方法作用