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

题解P7302 [BZOJ2131][NOI1998] 免费的馅饼

传送门

题意

n 个馅饼。第 i 个馅饼,在 ti 时掉落至 pi 处,人接到这个馅饼可以获得 vi 的价值。
人每单位时间可以移动 02 步。
时间从 0 开始,一开始人可站在任意处。

分析+暴力

一眼 dp ,于是我们可以分析一下 dp 数组。
fi 为第 i 个馅饼,第 i 个馅饼必选,人可以获得的最大价值。
转移:倘若 2×(titj)|pipj|,就可以从 fj 转移至 fi
至于从 0 转移,我们可以在初始化是便将 fi 赋值为 vi

暴力代码:

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(n2)
如此我们便可以愉快的拿到 85 分的高分,以至于再吸口氧后可以拿到 90。

优化

显然是优化枚举 j 的过程。

观察我们的判断式子:
2×(titj)|pipj|
拆掉绝对值,
2×ti2×tjpipj
2×ti2×tjpjpi
ij 归于两边,
2×tipi2×tjpj2×ti+pi2×tj+pj

观察这个式子,我们便可以马上想到,这不是熟悉的二维数点吗?

但是又有了一个问题,原来转移时,我们将 t 进行排序, 但是我们在二维数点时并不能同时将 t 排序,那我们又如何做呢?

我们再次分析原来的式子,很明显,当 titj 时,即使是我们分开的两个式子也无法转移。
由此,我们就可以顺利地用二维数点解决掉这道紫题。

至于二维数点,我们则可以用线段树或者树状数组来维护前缀最大值。
时间复杂度 O(nlogn)
Code

posted @   djh0314  阅读(19)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示