CF1491
B
注意讨论情况
C
可以这样考虑,每次都从第一个蹦蹦床起跳,当高度为1时顺延到下一个蹦蹦床,我们从前向后线性扫描一个一个把高度清成1即可。
for(int i=1; i<=n; i++)
{
int p = g[i] - c[i] - 1;
ans += max(p, 0);
//如果抵达的次数不够,需要从这里开始重新起跳
for(int j = i + 2; j <= min(i + g[i], n); j++) c[j] ++;
//j不需要等于1是因为,跳到g[i+1]等价于从g[i+1]起跳,顺延即可。
c[i+1] += max(-p, 0);
//显然,当g[i]处跳的次数过剩时,多出来的次数可以传递到g[i+1]
}

浙公网安备 33010602011771号