1 条题解
-
0
题目分析
我们需要处理在时间限制下的路径规划问题,其中:
- 每条道路有特定的开放时间窗口
- 可以在城市中使用技能回到1秒前(但不能跨天)
- 目标是 minimize 使用技能的次数
关键观察
1. 道路通行条件
对于道路 ,要在时刻 通过,必须满足:
这意味着如果我们到达道路端点的时间是 ,那么:
- 如果 ,需要等待到
- 如果 ,需要回溯时间到
2. 时间回溯的代价计算
设当前时间为 ,目标时间窗口为 :
- 如果 :需要等待,无代价
- 如果 :可以直接通过,无代价
- 如果 :需要回溯到 ,代价为
因此通过一条道路的代价函数为:
通过后的新时间为:
$$\text{new\_time}(t, l, r) = \max(l, \min(t, r)) + 1 $$3. 问题转化
对于查询 :
- 如果 :在同一城市,只需调整时间
- 如果 :向右移动
- 如果 :向左移动
由于道路是独立的,我们可以将问题分解为:
- 计算从 到 的最小代价
- 在终点处调整到目标时间
数据结构设计
我们需要支持:
- 区间查询:从位置 到位置 的最小代价
- 单点修改:更新道路的开放时间
线段树维护复合函数
对于区间 ,我们维护一个函数 表示:
- 输入:进入该区间的时间
- 输出:离开该区间的时间和使用技能的总次数
由于代价函数是分段线性的,我们可以用 三元组表示:
$$f(t) = (\text{new\_time}, \text{cost}) = \begin{cases} (a_1 \cdot t + b_1, c_1) & \text{if } t \le \text{threshold}_1 \\ (a_2 \cdot t + b_2, c_2) & \text{if } \text{threshold}_1 < t \le \text{threshold}_2 \\ \vdots \end{cases}$$实际上,经过分析,每个区间的函数最多有 个分段。
函数复合
设 和 ,则复合函数 为:
$$h(t) = g(f(t)) = (t_g(t_f(t)), c_f(t) + c_g(t_f(t))) $$算法实现
1. 节点信息
每个线段树节点存储:
- 对于向左移动和向右移动分别维护函数
- 函数用 表示:
- 在时间区间 内,输出时间为 ,代价为
2. 合并操作
合并两个相邻区间的函数时,需要考虑中间道路的约束:
其中 处理道路的时间约束。
3. 查询处理
对于查询 :
- 如果 :查询区间 的向右移动函数
- 如果 :查询区间 的向左移动函数
设查询结果为 ,则最终答案为:
复杂度分析
- 线段树建树:
- 单点修改:
- 区间查询:
- 总复杂度:
核心公式总结
-
单条道路处理:
$$\begin{aligned} \text{cost}(t, L, R) &= \max(0, t - (R-1)) \\ text{new_{time}}(t, L, R) &= max(L, min(t, R-1)) + 1 \end{aligned} $$ -
函数复合: 设 , ,则:
$$g \circ f(t) = (t_g(t_f(t)), c_f(t) + c_g(t_f(t))) $$ -
最终答案计算:
$$\text{answer} = text{travel_{cost}} + \max(0, text{arrival_{time}} - text{target_{time}}) $$
实现细节
- 使用动态开点线段树或zkw线段树
- 仔细处理函数的分段合并
- 注意边界情况( 的情况)
- 使用long long避免整数溢出
这个解法充分利用了问题的组合结构,通过函数复合的方式高效处理路径查询,满足了大数据规模的要求。
- 1
信息
- ID
- 4454
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者