把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

题解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

posted @ 2023-05-04 22:09  djh0314  阅读(46)  评论(0)    收藏  举报  来源
浏览器标题切换
浏览器标题切换end