#P12503. 「CEOI2025」最高层

「CEOI2025」最高层

注意事项

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

题目描述

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

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

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

此外,他的兄弟 Radu 和 Mircea 为 Vlad 提出了 mm 个场景,每个场景包含两个楼层 AABB (AB)(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,一个大小为 mmpair 向量。每个 pair 包含题目描述中的 AABB
  • 返回一个大小为 mm 的向量,包含 mm 个查询的答案。

示例评测程序

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

  • 11 行:nn
  • 22 行:v[0] v[1]  v[n1]v[0]\ v[1]\ \ldots\ v[n-1]
  • 33 行:w[0] w[1]  w[n1]w[0]\ w[1]\ \ldots\ w[n-1]
  • 44 行:mm
  • 5+i5+i (0im1)(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=733 个查询,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 成本的跳跃:从 0011(虽然他可以跳到 22,但楼层 11 会让他走得更远),然后从 1144。总成本:1+1=21+1=2

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

对于第三个查询 (0,6)(0, 6),一个成本为 44 的示例路径是从 0011(成本 11),1155(成本 22),5566(成本 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):从 3355(成本 11),5599(成本 22\Longrightarrow 总计:33
  • (0,9)(0, 9):从 0011(成本 11),1155(成本 22),5599(成本 22\Longrightarrow 总计:55
  • (0,7)(0, 7):从 0011(成本 11),1155(成本 22),5577(成本 11\Longrightarrow 总计:44
  • (0,4)(0, 4):从 0011(成本 11),1144(成本 22\Longrightarrow 总计:33
  • (3,5)(3, 5):从 3355(成本 11\Longrightarrow 总计:11

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

{3, 5, 4, 3, 1}

数据范围与提示

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

  • 1n,m5000001 \leq n, m \leq 500000
  • 对于所有 0in10 \leq i \leq n-11v[i],w[i]n1 \leq v[i], w[i] \leq n
  • 对于所有查询,0ABn10 \leq A \leq B \leq n-1

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

子任务 分值 附加限制
11 55 1n300,1m5000001 \leq n \leq 300, 1 \leq m \leq 500000
22 77 1n3000,1m30001 \leq n \leq 3000, 1 \leq m \leq 3000
33 1111 1n20000,1m200001 \leq n \leq 20000, 1 \leq m \leq 20000
44 4444 1n200000,1m2000001 \leq n \leq 200000, 1 \leq m \leq 200000
55 88 1n500000,1m5000001 \leq n \leq 500000, 1 \leq m \leq 500000,对于所有 0i<jn10 \leq i < j \leq n-1v[i]v[j]v[i] \leq v[j]w[i]w[j]w[i] \leq w[j]
66 2525 无附加限制