一个蛋糕有两种接法:分身接 / 本体接。
考虑令 \(g_{i}\) 表示 \(i\) 用分身接,最早在什么时刻本体能到位放下分身。令 \(f_{i,j}\) 表示 \(i\) 用本体接,分身将被去用于接 \(j\),这种方案是否可行。
考虑 \(g_i\) 的转移:
- \(i+1\) 用本体接:放完分身就跑过去,时间有多的话可以选择跑到 \(j\) 放分身等着,然后跑回来接蛋糕,更新 \(f_{i+1, j}\) 。
- \(i+1\) 用分身接:直接更新 \(g_{i+1}\) 。
考虑 \(f_{i,j}\) 的转移:
- \(j\not=i+1\):那么 \(i+1\) 需要用本体接,更新 \(f_{i+1,j}\) 。
- \(j=i+1\):此时的分身已经在 \(i+1\) 了不需要管,只需要考虑:
- \(i+2\) 用本体接:仍然考虑在后面挑一个点放分身,转移和 \(g_i\) 差不多。
- \(i+2\) 用分身接:更新 \(g_{i+2}\),最优方案就是直接往 \(i+2\) 跑,算好 \(i+1\) 蛋糕下落的时间。
最开始的想法是假的,因为本体分身接蛋糕时,另一个所在的合法位置不一定是连续的。大概率是受了 CF1539E 的影响 ...
不过因为蛋糕的接法序列肯定是分身一段本体一段,所以就去想想,如果当前位置本体接,那么需要哪些信息(分身信息:下一个接分身的点在哪);如果当前位置分身接,那么需要哪些信息(最早到达的时间:本体能*活动多远)。记录好信息,转移方程很好列出。
代码:Submission #131024907 - Codeforces