题解P7302 [BZOJ2131][NOI1998] 免费的馅饼
传送门
题意
有 $n$ 个馅饼。第 $i$ 个馅饼,在 $t_i$ 时掉落至 $p_i$ 处,人接到这个馅饼可以获得 $v_i$ 的价值。
人每单位时间可以移动 $0\sim 2$ 步。
时间从 $0$ 开始,一开始人可站在任意处。
分析+暴力
一眼 dp ,于是我们可以分析一下 dp 数组。
令 $\mathit{f}_ {i} $ 为第 $i$ 个馅饼,第 $i$ 个馅饼必选,人可以获得的最大价值。
转移:倘若 $2\times \left ( t_i - t_j\right ) \ge \left| p_i-p_j \right|$,就可以从 $f_j$ 转移至 $f_i$。
至于从 0 转移,我们可以在初始化是便将 $f_i$ 赋值为 $v_i$。
暴力代码:
sort(a+1,a+n+1);
for(int i=1; i<=n; ++i) {
f[i]=a[i].val;
for(int j=1; j<i; ++j) {
if((a[i].t-a[j].t)*2>=abs(a[i].p-a[j].p))
f[i]=max(f[i],f[j]+a[i].val);
}
ans=max(ans,f[i]);
}
时间复杂度 $O(n^2)$。
如此我们便可以愉快的拿到 85 分的高分,以至于再吸口氧后可以拿到 90。
优化
显然是优化枚举 $j$ 的过程。
观察我们的判断式子:
$2\times \left ( t_i - t_j\right ) \ge \left| p_i-p_j \right|$,
拆掉绝对值,
$2\times t_i-2\times t_j \ge p_i-p_j$,
$2\times t_i-2\times t_j \ge p_j-p_i$。
将 $i$ 与 $j$ 归于两边,
$2\times t_i-p_i \ge 2\times t_j - p_j $,$2\times t_i+p_i \ge 2\times t_j + p_j $。
观察这个式子,我们便可以马上想到,这不是熟悉的二维数点吗?
但是又有了一个问题,原来转移时,我们将 $t$ 进行排序, 但是我们在二维数点时并不能同时将 $t$ 排序,那我们又如何做呢?
我们再次分析原来的式子,很明显,当 $t_i\ge t_j$ 时,即使是我们分开的两个式子也无法转移。
由此,我们就可以顺利地用二维数点解决掉这道紫题。
至于二维数点,我们则可以用线段树或者树状数组来维护前缀最大值。
时间复杂度 $O(n\log n)$。
Code。

浙公网安备 33010602011771号