AGC007 - C Pushing Ball
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;
}
AGC007 - C Pushing Ball的更多相关文章
- 【AtCoder】AGC007
AGC007 A - Shik and Stone 如果i + j走过的格子只有一个,那么就是可以走到 #include <bits/stdc++.h> #define fi first ...
- AOJ 0033 Ball【DFS】
有一个筒,从A口可以放球,放进去的球可通过挡板DE使其掉进B管或C管里,现有带1-10标号的球按给定顺序从A口放入,问是否有一种控制挡板的策略可以使B管和C管中的球从下往上标号递增. 输入: 第一行输 ...
- iOS 因为reason: 'Pushing the same view controller instance more than once is not supported而奔溃(下)
这个问题是什么意思呢,之前遇到过几次,但程序再次打开时没有问题,也就没有重视,今天又遇到了,无法忍受啊. 控制台报的错误是:"不支持多次推入相同的视图控制器实例". 什么原因造成的 ...
- var ball0=new Ball("executing") 是怎样被执行的?
function Ball(message){ alert(message); }; var ball0=new Ball("executing"); //var ball0=ne ...
- blue and red ball
#include<iostream> #include<cstring> using namespace std; int sum; ]; int n; int head; i ...
- HDU 1556 Color the ball(线段树区间更新)
Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...
- HD1556Color the ball(树状数组)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- ApiWrapper
前面两片文章讲解了通过AIDL和Messenger两种方式实现Android IPC.而本文所讲的并不是第三种IPC方式,而是对前面两种方式进行封装,这样我们就不用直接把Aidl文件,java文件拷贝 ...
- Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- Messenger
Messenger类实际是对Aidl方式的一层封装.本文只是对如何在Service中使用Messenger类实现与客户端的通信进行讲解,对Messenger的底层不做说明.阅读Android Prog ...
随机推荐
- java实现 zip解压缩
程序实现了ZIP压缩.共分为2部分 : 压缩(compression)与解压(decompression) 大致功能包括用了多态,递归等JAVA核心技术,可以对单个文件和任意级联文件夹进行压缩和解压. ...
- 1014-31-首页12-显示weibo未读数--后台运行---定时器
/** * 当app进入后台时调用 */- (void)applicationDidEnterBackground:(UIApplication *)application{ /** ...
- 20145202马超GDB调试汇编堆栈过程分析
20145202马超GDB调试汇编堆栈过程分析 esc :w保存,:wq保存并退出 x:删除错误的单个字母 dw:删除整个单词 gcc hello.c -o hello:运行hello.c gcc - ...
- compileReleaseJavaWithJavac
如果你打release 包的时候,出现这个问题,那么请你先跑一下程序,肯定是有什么方法名,或者什么东西没找到. release 的时候不会报错,只有你跑的时候才会报错.
- build dynamic libraries for iOS and load them at runtime
编译了libmt.dylib, 和 test 程序调用,均正常.在xcode中显示调用正常,隐式调用则出现问题. 提示 dyld: Library not loaded. 即使存在在/usr/lib/ ...
- 编译gearman提示缺少boost
编译german时提示缺少boost: checking for boostlib >= 1.39... configure: We could not detect the boost lib ...
- 24、php知识点总结基础教程--part-2
1.表单处理 ①post请求 <html> <body> <form action="welcome.php" method="post&q ...
- .gitignore 中文文件夹无效
有个文件夹名如:测试 在.gitignore中添加 /测试/ 但运行命令git status后发现还是被追踪到了 一番搜索后终于发现.gitignore文件编码是GBK的,重新将文件保存成utf ...
- markdown备忘
文章主要(99%)参考自:markdown基本语法 这是二级标题 这是加粗的文字 这是倾斜的文字` 这是引用的内容 这是引用的内容 以下是分割线: 超链接 列表内容1 列表内容2 列表内容3 1.列表 ...
- 孤荷凌寒自学python第二十五天初识python的time模块
孤荷凌寒自学python第二十五天python的time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 通过对time模块添加引用,就可以使用python的time模块来进行相关的时间操 ...