手持ち花火
看 deepl 翻译的 pdf 笑了一晚上,Link。
单调性
首先发现答案具有单调性,可以二分求解。
十分容易证明,如果现在的速度是 ,那么对于答案大于 的情况他们完全可以沿用速度为 的方案跑完。
不必要的情况
接下来跟着官方题解手玩输入样例,发现了一下一些情况:
- 对于一样的场面,似乎只改变 也会影响答案的方案。
- 有些人可能会停下来。
- 有很多人的烟花在被同时点燃。
但是其实这些情况都是没有必要的,似乎有多人做题的时候被误导了(但是学校模拟赛没有给样例解释导致题目没有看懂)。
情况
显然会有一种通用的方式,如果这个方式可以满足较小的 那么也一定可以满足较大的 。
具体的,让本会熄灭的人拿着烟花在站着就行了。
情况
显然,停止是不必要的。
具体的,如果我们要停止 秒那么我们可以向相反方向前进 就行了。
因为我们考虑的是相对位置,所以整体一起向一个方向移动移动可是一种思路。
情况
只考虑 个的情况,其他的情况容易拓展。
考虑分情况讨论:
- 如果 个人相遇后向同一方向运动,那么显然我们可以让其中 个人点火之后一起跑,等第 个人熄灭之后再传递给第 个人。这样有火的时间就从 变成了 。
- 如果 个人相遇之后向相反方向移动,那么我们考虑延迟第 个人的点时间。为了不影响相对位置,我们可以让第 个人先点火,然后让与第 个人有关的人一起与第 个人运动,保持相对位置不要变。这样当第 个人的火将要熄灭的时候第 个人再点燃。
规律
- 因为情况 ,场上最多只有 个人的火把被点燃。
- 没点燃的人不会主动远离已经点燃的人,也就是会主动靠近被点燃的人。
- 拿着烟花的人应该主动靠近下一个需要被点燃的人,这十分显然。
也就是说如果确定了点燃的顺序,那么点燃的最有方案就是确定的。
所以容易想到 的做法,可惜题目没有给分。
可行性优化
如果有 个人 顺序排列,那么按照 的顺序点火肯定没有按照 或者 的顺序点火优秀。
因此对于任意时刻,被点燃的火把一定是一个包含 的连续区间。
那么我们就只需要讨论两侧的情况就行了,时间复杂度为 ,这样可以获得 分。
最优性优化
因为我们发现点燃的一定是一个包含 的连续的区间,那么容易想到将最初的 逐步向外拓展到 。
假设区间 是合法的,那么需要满足一下不等式才能扩展到 。
容易理解一个区间 内的所有人汇聚到 的时间为 。如果出现了 或者 距离 比较近,提前到达了但是另一侧的点还没有到达,那么所有在 点的人可以一起向另一侧运动。
那么如果区间 满足条件可以拓展到 的要求就是:
其意义就是区间 可以一直燃烧直到 来到 。
同理,如果区间 满足条件可以拓展到 的要求就是:
考虑维护 表示区间 能否被表示,直接 转移即可,时间复杂度为 ,可以获得 分。
不知道叫什么的优化
按照套路,将上面的不等式移项,把 和 分开,得到:
那么如果令 ,就得到如果可以过渡到 那么需要满足:
同理,如果要过度到 需要满足:
那么我们可以转化题意:
初始时 ,始终需要满足 ,每一次操作将 或者 ,问是是否村子啊一个操作到最后使得 。
如果存在一个 满足 且 ,那么显然 也是合法的,对于 也是同理。
令 取小于 的最大的 的位置, 取大于 的最小的 的位置,那么我们的贪心在最极限的情况下可以到达 。
考虑从 向回推,如果可以推到 那么就是合法的,反之如果推不到那么就是不合法的。
时间复杂度为 ,可以获得 分。
Code
过于的丑陋。