BZOJ 2131 免费的馅饼(DP,二维偏序问题 / 旋转坐标轴转化问题)BZOJ 修复工程

Posted 繁凡さん

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 2131 免费的馅饼(DP,二维偏序问题 / 旋转坐标轴转化问题)BZOJ 修复工程相关的知识,希望对你有一定的参考价值。

整理的算法模板合集: ACM模板

点我看算法全家桶系列!!!

实际上是一个全新的精炼模板整合计划


题目链接

https://hydro.ac/d/bzoj/p/2131

hydro 的 BZOJ 修复工程 !(我也去领了一点题慢慢修着玩,这题就是我修的嘿嘿嘿)

题目描述

SERKOI 最新推出了一种叫做 “免费馅饼” 的游戏:游戏在一个舞台上进行。舞台的宽度为 w w w​​ 格(从左到右依次用 1 ∼ w 1\\sim w 1w​ 编号),游戏者占一格。开始时游戏者可以站在舞台的任意位置,手里拿着一个托盘。下图为天幕的高度为 4 4 4 格时某一个时刻游戏者接馅饼的情景。

游戏开始后,从舞台天幕顶端的格子中不断出现馅饼并垂直下落。游戏者左右移动去接馅饼。游戏者每秒可以向左或者向右移动一格或两格,也可以以站在原地不动。

当馅饼在某一时刻恰好到达游戏者所在的格子中,游戏者就收集到了这块馅饼。当馅饼落在一个游戏者不在的格子里时该馅饼就消失。

写一个程序,帮助我们的游戏者收集馅饼,使得所收集馅饼的分数之和最大。

输入格式

第一行是用空格隔开的两个正整数,分别给出了舞台的宽度 w w w 和馅饼的个数 n n n

接下来 n n n 行,每一行给出了一块馅饼的信息。由三个正整数组成,分别表示了每个馅饼落到舞台上的时刻 t i t_i ti,掉到舞台上的格子的编号 p i p_i pi,以及分值 v i v_i vi

游戏开始时刻为 0 0 0 。输入文件中同一行相邻两项之间用一个空格隔开。输入数据中可能存在两个馅饼的 t i t_i ti p i p_i pi 都一样。

输出格式

一个数,表示游戏者获得的最大总得分。

输入样例

3 4
1 2 3
5 2 3
6 3 4
1 1 5

输出样例

12

数据规模与约定

对于 100 % 100\\% 100% 的数据, 1 ≤ w ≤ 1 0 8 1\\le w\\le 10^8 1w108 1 ≤ n ≤ 1 0 5 1\\le n \\le 10^5 1n105 1 ≤ t i ≤ 1 0 8 1\\le t_i\\le 10^8 1ti108 1 ≤ p i ≤ w 1\\le p_i\\le w 1piw 1 ≤ v i ≤ 1000 1\\le v_i\\le 1000 1vi1000

Solution

比较简单的一道题。

显然考虑 DP 。

f [ i ] f[i] f[i] 表示接住第 i i i 个馅饼以后能获得的最大的分数。

显然有转移方程:

f [ i ] = max ⁡ { f [ j ] ∣ ∣ p i − p j ∣ ≤ 2 × ( t i − t j ) } + v i f[i] = \\max\\{f[j]\\mid |p_i-p_j|\\le 2\\times (t_i-t_j)\\} + v_i f[i]=max{f[j]pipj2×(titj)}+vi

直接转移显然是 O ( n 2 ) O(n^2) O(n2) 的, n ≤ 1 0 5 n\\le 10^5 n105,考虑优化。

显然我们可以从转移的条件 j j j 入手。对于每一个可以转移到 i i i j j j ,需要满足 ∣ p i − p j ∣ ≤ 2 × ( t i − t j ) |p_i-p_j|\\le 2\\times (t_i-t_j) pipj2×(titj),展开后有:

∣ p i − p j ∣ ≤ 2 × ( t i − t j ) − 2 × ( t i − t j ) ≤ p i − p j ≤ 2 × ( t i − t j ) 2 × t i − p i ≥ 2 × t j − p j   o r   2 × t i + p i ≥ 2 × t j + p j |p_i-p_j|\\le 2\\times (t_i-t_j)\\\\ -2\\times( t_i-t_j)\\le p_i-p_j\\le 2\\times (t_i-t_j)\\\\ 2\\times t_i-p_i\\ge 2\\times t_j-p_j\\ \\mathrm{or}\\ 2\\times t_i+p_i\\ge 2\\times t_j+p_j pipj2×(titj)2×(titj)pipj2×(titj)2×tipi2×tjpj or 2×ti+pi2×tj+pj
a 1 = 2 × t i − p i , a 2 = 2 × t i + p i a_1=2\\times t_i-p_i,a_2=2\\times t_i+p_i a1=2×tipi,a2=2×ti+pi,显然我们只需要按照 a 1 a_1 a1 或者 a 2 a_2 a2 递增的顺序排序即可直接递推,然后问题就变成了一个类 L I S LIS LIS 问题也即二维偏序问题,使用树状数组维护最优值即可。

注意给定的 w

以上是关于BZOJ 2131 免费的馅饼(DP,二维偏序问题 / 旋转坐标轴转化问题)BZOJ 修复工程的主要内容,如果未能解决你的问题,请参考以下文章

bzoj2131免费的馅饼 dp+树状数组

免费的馅饼 HYSBZ - 2131 (树状数组维护二维偏序)

bzoj 2131: 免费的馅饼

[bzoj2131]免费的馅饼_树状数组

bzoj2131: 免费的馅饼

[bzoj]2131: 免费的馅饼