根据题意不难发现这个模型是不好进行贪心的,于是可以考虑使用 \(dp\)。可以令 \(dp_i\) 表示在 \(i\) 位置以最优策略能获得的报酬期望值,那么会有转移:

\[dp_i = \max(f_i, \frac{1}{2}(dp_{i - 1} + dp_{i + 1}))
\]

不难发现上面这个 \(dp\) 的转移是有后效性的,但类似地往两边的转移方式在 [六省联考2017]分手是祝愿 中遇到过。但可以发现的是,在那道题的第一个方法当中因为我们终点都是同一个位置所以才可以改变状态向同一边转移,在本题当中这种方法显然是不可取的。

那么另一种方法能否使用呢?你会发现这样一个事实,我们找到 \(i\) 左侧第一个停下来更优的位置记作 \(l\),右侧第一个停下来更优的位置记作 \(r\)。那么 \([l, r]\) 中的位置向左向右都只会走到 \(l, r\) 然后停止,于是我们可以使用第二种方法来观察一下这一段转移的特色。

首先会有:

\[dp_l = f_l, dp_{l + 1} = \frac{1}{2} f_l + \frac{1}{2} dp_{l + 2}, dp_{l + 2} = \frac{1}{3}f_l + \frac{2}{3}dp_{l + 3}
\]

那么一般地,会有:

\[dp_i = \frac{1}{i - l + 1}f_l + \frac{i - l}{i - l + 1} dp_{i + 1}(l < i < r)
\]

同时需要注意到 \(dp_r = f_r\),则会有:

\[dp_{r - 1} = \frac{1}{r - l} f_l + \frac{r - l - 1}{r - l} f_r
\]

类似于前面的归纳方式,同理可以得到:

\[dp_i = \frac{r - i}{r - l} f_l + \frac{i - l}{r - l} f_r(l < i < r)
\]

貌似这样还是看不出有什么特别之处,那么可以尝试将假设进一步特殊化。就令 \(l = 0, r = n\) 尝试一下,那么会发现:

\[dp_i = \frac{i}{n} f_n(1 \le i < n)
\]

这不恰好是一个正比例函数的形式吗?即 \(y = \dfrac{f_n}{n} \times i\) 的形式。那么是不是最上面哪个也会是某个一次函数呢?可以考虑能否将 \(dp\) 转移方程化简成一次函数的形式,不难发现可以整理成如下形式:

\[dp_i = \frac{f_r - f_l}{r - l} (i - l) + f_l(l < i < r)
\]

可以看出这就是将直线 \(y = \dfrac{f_r - f_l}{r - l}x + f_l\) 向右平移 \(l\) 个单位所得直线,也就是 \((l, f_l), (r, f_r)\) 所连成的直线。那么我们惊喜地发现,以 \(l, r\) 为停下左右端点对中间每个点 \(i\) 的贡献为 \(i\) 在 \((l, f_l), (r, f_r)\) 上 \(i\) 位置对应的纵坐标。那么结合图像可以发现为了使得答案最优,不会存在任意一个点 \(i\) 其 \(f_i\) 大于在其在直线上的纵坐标。回过头来整体地看,这所有的直线连成的一个图形不恰好是 \((i, f_i)\) 所形成的凸包吗?于是我们只需求出这 \(n\) 个点的凸包然后在上面求答案即可。因为 \(f_i > 0\) 因此只需使用类似斜率优化的方法求凸包即可。时间复杂度 \(O(n)\)。

因为本题卡精度,所以只能使用和 \(std\) 一样的输出方式才能通过 TAT。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i, l, r) for (int i = l; i <= r; ++i)
const int N = 100000 + 5;
int n, top, f[N], st[N], ans[N];
int read() {
char c; int x = 0, f = 1;
c = getchar();
while (c > '9' || c < '0') { if(c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
double slope(int a, int b) {
return 1.0 * (f[a] - f[b]) / (a - b);
}
signed main(){
n = read();
rep(i, 1, n) f[i] = read();
rep(i, 0, n + 1) {
for (; top > 1 && slope(st[top - 1], i) > slope(st[top - 1], st[top]); --top) ;
st[++top] = i;
}
rep(i, 1, top - 1) {
int j = st[i];
for(; j <= st[i + 1]; ++j)
ans[j] = 100000ll * (f[st[i]] * (st[i + 1] - j) + f[st[i + 1]] * (j - st[i])) / (st[i + 1] - st[i]);
}
rep(i, 1, n) printf("%lld\n", ans[i]);
return 0;
}

值得一提的是,这种放宽条件特殊化的方法在本题当中反复出现。极端情况找规律这种思想也扮演着不可或缺的角色。

[USACO18DEC]Balance Beam P的更多相关文章

  1. 洛谷P5155 [USACO18DEC]Balance Beam(期望,凸包)

    你以为它是一个期望dp,其实它是一个凸包哒! 设平衡木长度为\(L\),把向右走平衡木那个式子写一下: \[dp[i]=\frac{dp[i+1]+dp[i-1]}{2}\] 然后会发现这是一个等差数 ...

  2. Luogu5155 [USACO18DEC]Balance Beam

    题目链接:洛谷 这道题看起来是个期望题,但是其实是一道计算几何(这种题太妙了) 首先有一个很好的结论,在一个长度为$L$的数轴上,每次从$x$处出发,不停地走,有$\frac{x}{L}$的概率从右端 ...

  3. [USACO18DEC]Balance Beam

    题目链接:这里 或者这里 答案是很显然的,记\(g(i)\)为在\(i\)下平衡木时的期望收益 那么\(g(i)=max(f(i),\frac{g(i-1)+g(i+1)}{2})\) 好了做完了 T ...

  4. 题解-USACO18DEC Balance Beam详细证明

    (翻了翻其他的题解,觉得它们没讲清楚这个策略的正确性) Problem 洛谷5155 题意概要:给定一个长为\(n\)的序列,可以选择以\(\frac 12\)的概率进行左右移动,也可以结束并得到当前 ...

  5. Luogu5155 USACO18DEC Balance Beam(概率期望+凸包)

    假设已经求出了在每个点的最优期望收益,显然最优策略是仅当移动一次后的期望收益>当前点收益时移动.对于初始点,其两边各存在一个最近的不满足上述条件的位置,因此从初始点开始随机游走,直到移动到这两个 ...

  6. p5155 [USACO18DEC]Balance Beam

    传送门 分析 https://www.luogu.org/blog/22112/solution-p5155 代码 #include<bits/stdc++.h> using namesp ...

  7. 题解 [USACO18DEC]Balance Beam

    被概率冲昏的头脑~~~ 我们先将样例在图上画下来: 会发现,最大收益是: 看出什么了吗? 这不就是凸包吗? 跑一遍凸包就好了呀,这些点中,如果i号点是凸包上的点,那么它的ans就是自己(第二个点),不 ...

  8. bzoj5483: [Usaco2018 Dec]Balance Beam

    又又又又又又又被踩爆了 首先容易写出这样的期望方程:f(1)=max(d(1),f(2)/2),f(n)=max(d(n),f(n-1)/2), f(i)=max(d(i),(f(i-1)+f(i+1 ...

  9. 当PsychicBoom_发觉自己是个大SB的时候……

    这些题都是没ac调了好久发现是sb错误的题--. 想清楚再写题!!! 2019.4.18 洛谷P5155 [USACO18DEC]Balance Beam 转移方程\((a[l[i]]*(r[i]-i ...

随机推荐

  1. POJ 3126:Prime Path(素数+BFS)

    The ministers of the cabinet were quite upset by the message from the Chief of Security stating that ...

  2. 第四十七个知识点:什么是Fiat-Shamir变换?

    第四十七个知识点:什么是Fiat-Shamir变换? 只要Alice和Bob同时在线,Sigma协议能快速的完成Alice向Bob证明的任务.Alice向Bob发送承诺,Bob返回一个挑战,最后Ali ...

  3. Variational Inference with Normalizing Flow

    目录 概 主要内容 一些合适的可逆变换 代码 Rezende D., Mohamed S. Variational Inference with Normalizing Flow. ICML, 201 ...

  4. Swoole 中协程的使用注意事项及协程中的异常捕获

    协程使用注意事项 协程内部禁止使用全局变量,以免发生数据错乱: 协程使用 use 关键字引入外部变量到当前作用域禁止使用引用,以免发生数据错乱: 不能使用类静态变量 Class::$array / 全 ...

  5. python 根据传进来的参数,动态拼接sql

    根据传进来的参数,动态拼接sql,可用于实现一个方法,有些字段不确定,又用到的情况,如查询,三个查询条件,有的时候只用到一个查询条件,其他用不到则不需要拼接 def show_runjob_detai ...

  6. Python web框架开发 - WSGI协议

    浏览器进行http请求的时候,不单单会请求静态资源,还可能需要请求动态页面. 那么什么是静态资源,什么是动态页面呢? 静态资源 : 例如html文件.图片文件.css.js文件等,都可以算是静态资源 ...

  7. 第10组-Alpha冲刺 总结

    1.基本情况 组长博客链接:https://www.cnblogs.com/cpandbb/p/14007413.html 答辩总结: ·产品偏离了最开始的方向,地图和刷一刷功能做得没那么好,外卖订单 ...

  8. java 8 - java 17 升级指北

    2014年发布的java SE 8和2017年发布的java EE 8,至今还是使用最广泛的java版本,大部分java开发者对于java 8之后的升级总是敬而远之,这跟java 9以后的破坏性升级和 ...

  9. x86架构应用如何向Arm架构低成本迁移

    曾几何时,无论是在服务器还是个人电脑,CPU芯片领域一直是 Intel 独占鳌头,旗下的 X86_64 架构被广泛采用.然而王权没有永恒,近年来 Arm64 架构异军突起,服务器端有华为鲲鹏920高性 ...

  10. 使用nexus搭建一个maven私有仓库

    使用nexus搭建一个maven私有仓库 大家好,我是程序员田同学.今天带大家搭建一个maven私有仓库. 很多公司都是搭建自己的Maven私有仓库,今天就带大家使用nexus搭建一个自己的私有仓库, ...