#HK5315. 「CEOI2025」最高层

「CEOI2025」最高层

注意事项

在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:

  • C++(标准为 C++ 17 及以上)

请在提交源代码前添加 #include "highest.h"。

题目描述

题目译自 CEOI 2025 Day1 T2「Highest」

在一个平行宇宙中,Vlad 被困在 Poenari 堡垒的未来版本中,这个堡垒现在有 nn 层楼,编号从 00 到 n−1n-1。从每层楼 ii (0≤i≤n−1)(0 \leq i \leq n-1) 开始,他只能向上走,可以选择走楼梯并支付 11 滴血(这是吸血鬼在罗马尼亚使用的货币),或者变成蝙蝠通过通风管道,需支付 22 滴血。楼梯可以让他向上走最多 v[i]v[i] 层,而通风管道可以让他向上走最多 w[i]w[i] 层,其中 vv 和 ww 是给定的两个数组:v=v[0],v[1],…,v[n−1]v = v[0], v[1], \ldots, v[n-1] 和 w=w[0],w[1],…,w[n−1]w = w[0], w[1], \ldots, w[n-1]。

形式上,从楼层 ii (0≤i≤n−1)(0 \leq i \leq n-1),Vlad 可以:

  • 到达从楼层 i+1i+1 到楼层 i+v[i]i+v[i] 的任意位置,不超过 n−1n-1,费用为 11
  • 到达从楼层 i+1i+1 到楼层 i+w[i]i+w[i] 的任意位置,不超过 n−1n-1,费用为 22

此外,他的兄弟 Radu 和 Mircea 为 Vlad 提出了 mm 个场景,每个场景包含两个楼层 AA 和 BB (A≤B)(A \leq B)。Vlad 必须回答他们的 mm 个问题:从楼层 AA 到楼层 BB 需要牺牲的最少血量是多少?

实现细节

你需要实现函数 solve:

std::vector<int> solve(std::vector<int> &v, std::vector<int> &w,
    std::vector<std::pair<int,int>> &queries);
  • 接收向量 vv,楼梯的高度,以及 ww,每个楼层起始的通风系统高度,两个向量的大小均为 nn。
  • 还接收 queries,一个大小为 mm 的 pair 向量。每个 pair 包含题目描述中的 AA 和 BB。
  • 返回一个大小为 mm 的向量,包含 mm 个查询的答案。

示例评测程序

示例评测程序读取以下格式的输入:

  • 第 11 行:nn
  • 第 22 行:v[0] v[1] … v[n−1]v[0]\ v[1]\ \ldots\ v[n-1]
  • 第 33 行:w[0] w[1] … w[n−1]w[0]\ w[1]\ \ldots\ w[n-1]
  • 第 44 行:mm
  • 第 5+i5+i (0≤i≤m−1)(0 \leq i \leq m-1) 行:A BA\ B

并输出 mm 行,调用 solve 的结果。

样例 1

考虑以下调用:

solve({2, 3, 1, 1, 1, 1, 2}, {3, 4, 1, 2, 1, 2, 2},
    {{0, 4}, {0, 5}, {0, 6}})

这里我们有 n=7n=7 和 33 个查询,v=[2,3,1,1,1,1,2]v=[2, 3, 1, 1, 1, 1, 2] 和 w=[3,4,1,2,1,2,2]w=[3, 4, 1, 2, 1, 2, 2]。

对于第一个查询 (0,4)(0, 4),Vlad 需要进行两次 11 成本的跳跃:从 00 到 11(虽然他可以跳到 22,但楼层 11 会让他走得更远),然后从 11 到 44。总成本:1+1=21+1=2。

对于第二个查询 (0,5)(0, 5),有 22 条最优路径:从 00 到 11(成本 11),11 到 44(成本 11),44 到 55(成本 11);第二条路径是从 00 到 11(成本 11),11 到 55(成本 22)。总成本:1+1+1=1+2=31+1+1=1+2=3。

对于第三个查询 (0,6)(0, 6),一个成本为 44 的示例路径是从 00 到 11(成本 11),11 到 55(成本 22),55 到 66(成本 11)。总成本:1+2+1=41+2+1=4

因此,函数返回的向量必须是:

{2, 3, 4}

样例 2

考虑以下调用:

solve({1, 1, 1, 2, 3, 2, 1, 1, 2, 3}, {2, 4, 1, 4, 1, 4, 1, 3, 2, 3},
    {{3, 9}, {0, 9}, {0, 7}, {0, 4}, {3, 5}})

这些是查询的最优路径:

  • (3,9)(3, 9):从 33 到 55(成本 11),55 到 99(成本 22)⟹\Longrightarrow 总计:33
  • (0,9)(0, 9):从 00 到 11(成本 11),11 到 55(成本 22),55 到 99(成本 22)⟹\Longrightarrow 总计:55
  • (0,7)(0, 7):从 00 到 11(成本 11),11 到 55(成本 22),55 到 77(成本 11)⟹\Longrightarrow 总计:44
  • (0,4)(0, 4):从 00 到 11(成本 11),11 到 44(成本 22)⟹\Longrightarrow 总计:33
  • (3,5)(3, 5):从 33 到 55(成本 11)⟹\Longrightarrow 总计:11

因此,函数返回的向量必须是:

{3, 5, 4, 3, 1}

数据范围与提示

对于所有输入数据,满足:

  • 1≤n,m≤5000001 \leq n, m \leq 500000。
  • 对于所有 0≤i≤n−10 \leq i \leq n-1,1≤v[i],w[i]≤n1 \leq v[i], w[i] \leq n。
  • 对于所有查询,0≤A≤B≤n−10 \leq A \leq B \leq n-1。

详细子任务附加限制及分值如下表所示。

子任务 分值 附加限制
11 55 1≤n≤300,1≤m≤5000001 \leq n \leq 300, 1 \leq m \leq 500000
22 77 1≤n≤3000,1≤m≤30001 \leq n \leq 3000, 1 \leq m \leq 3000
33 1111 1≤n≤20000,1≤m≤200001 \leq n \leq 20000, 1 \leq m \leq 20000
44 4444 1≤n≤200000,1≤m≤2000001 \leq n \leq 200000, 1 \leq m \leq 200000
55 88 1≤n≤500000,1≤m≤5000001 \leq n \leq 500000, 1 \leq m \leq 500000,对于所有 0≤i<j≤n−10 \leq i < j \leq n-1,v[i]≤v[j]v[i] \leq v[j] 且 w[i]≤w[j]w[i] \leq w[j]
66 2525 无附加限制