Warning: session_start(): open(/tmp/sess_91d2898f871f45416c3172a2496ef60d, O_RDWR) failed: No space left on device (28) in /data/wiki/inc/init.php on line 239

Warning: session_start(): Failed to read session data: files (path: ) in /data/wiki/inc/init.php on line 239

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/auth.php on line 430

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/actions.php on line 38

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/lib/tpl/dokuwiki/main.php on line 12
2020-2021:teams:legal_string:jxm2001:contest:牛客练习赛85 [CVBB ACM Team]

用户工具

站点工具


2020-2021:teams:legal_string:jxm2001:contest:牛客练习赛85

这是本文档旧的修订版!


牛客练习赛83

F - 音游家的谱面(Hard version)

题意

给定 $n$ 条轨道和一个含有 $m$ 个音符的谱,每个音符出现的轨道为 $p_i$。

玩家有两个手指,一开始分别位于轨道 $1$ 和轨道 $n$ 的底部,且两个手指每秒可以向左右移动一格。

玩家的任务是在音符恰好到达底部时用手指敲击音符。

现要求构造每个音符到达底部的时刻,使得谱中每个音符依次出现的时刻不早于上一个音符,且玩家可以顺利完成任务。

要求最小化最后一个音符达到底部的时刻,如果有多种方案,任意输出一种即可。$(n,m\le 5000)$

题解

设 $f(i,j)$ 表示第 $i$ 个音符到达底部且一只手位于 $p_i$ 且另一只手位于 $j$ 的最小时刻,于是有状态转移

$$ f(i,j)\gets f(i-1,k)+|p_i-p_{i-1}|(|j-k|\le |p_i-p_{i-1}|) $$

$$ f(i,j)\gets f(i-1,k)+|p_i-k|(|j-p_{i-1}|\le |p_i-k|) $$

暴力做法时间复杂度 $O(n^2m)$,方案输出用回溯即可。

考虑线段树优化,枚举 $k$ 然后更新所有 $f(i,j)$。线段树只需要维护区间最值操作和单点查询操作,时间复杂度 $O(nm\log n)$。

该复杂度实际上已经可能可以通过本题(如果卡常技巧优秀),但实际上存在进一步优化。

查看代码

查看代码

 
2020-2021/teams/legal_string/jxm2001/contest/牛客练习赛85.1624952832.txt.gz · 最后更改: 2021/06/29 15:47 由 jxm2001