luogu#P7599. [APIO2021] 雨林跳跃

[APIO2021] 雨林跳跃

题目背景

本题只支持 C++ 提交,不支持 C++14 (GCC 9),提交时不需要包含 jumps.h 头文件,只需要将附件中的 jumps.h 中的内容粘贴到代码的开头即可。

由于洛谷的测试点限制,本题只能评测其中的 100 组数据。

题目描述

在苏门答腊岛的热带雨林中,有 NN 棵树排成一排,从左到右依次用 00N1N-1 进行编号,其中 ii 号树的高度为 H[i]H[i],且所有树的高度互不相同

Pak Dengklek 正在训练一只猩猩,让她能够从一棵树上跳到另一棵树上。对于一次跳跃,猩猩可以从一棵树,向左或向右跳到比当前这棵树高的第一棵树上。形式化地,如果猩猩当前在 xx 号树,那么当且仅当满足下列条件之一时,她能够跳到 yy 号树上:

  • yy 是满足 H[z]>H[x]H[z]>H[x] 的所有 zz 中比 xx 小的最大非负整数;或者:
  • yy 是满足 H[z]>H[x]H[z]>H[x] 的所有 zz 中比 xx 大的最小非负整数。

Pak Dengklek 有 QQ 个跳跃计划,每个计划用四个整数 AABBCCDDAB<CDA \le B<C \le D)来描述。对于每个计划,Pak Dengklek 想知道猩猩是否能够从某棵树 ssAsBA \le s \le B)出发,经过若干次跳跃,到达某棵树 eeCeDC \le e \le D)。若该计划可行,Pak Dengklek 还想知道可行方案中猩猩需要的最少跳跃次数。

你需要实现下列函数:

void init(int N, int[] H)

  • NN:树的数量。
  • HH:大小为 NN 的数组,H[i]H[i] 表示 ii 号树的高度。
  • 该函数在第一次 minimum_jumps 的调用前,将会被调用恰好一次。

int minimum_jumps(int A, int B, int C, int D)

  • A,BA,B:可以用作起点的树的编号范围。
  • C,DC,D:可以用作终点的树的编号范围。
  • 该函数需要返回可行方案中猩猩需要的最少跳跃次数,或者返回 1-1 表示该计划不可行。
  • 该函数将被调用恰好 QQ 次。

输入格式

示例测试程序按如下格式读取输入数据:

  • 11 行:NN QQ
  • 22 行:H[0]H[0] H[1]H[1] \cdots H[N1]H[N-1]
  • 3+i3+i0iQ10 \le i \le Q-1)行:AA BB CC DD,表示第 iiminimum_jumps 调用的参数。

输出格式

示例测试程序按如下格式输出你的答案:

  • 1+i1+i0iQ10 \le i \le Q-1)行:第 iiminimum_jumps 调用的返回值。
7 3
3 2 1 6 4 5 7
4 4 6 6
1 3 5 6
0 1 2 2

2
1
-1

提示

【样例解释】

考虑如下调用:

init(7, [3, 2, 1, 6, 4, 5, 7])

在初始化完成后,考虑如下调用:

minimum_jumps(4, 4, 6, 6)

该计划意味着猩猩必须从 44 号树(高度为 44)出发,并到达 66 号树(高度为 77)。

一种跳跃次数最少的可行方案为:先跳到 33 号树(高度为 66),再跳到 66 号树。

另一种方案为:先跳到 55 号树(高度为 55),再跳到 66 号树。

因此,minimum_jumps 应该返回 22

考虑另一个调用:

minimum_jumps(1, 3, 5, 6)

该计划意味着猩猩必须从 11 号树(高度为 22),22 号树(高度为 11),或 33 号树(高度为 66)之一出发,并最终到达 55 号树(高度为 55)或者 66 号树(高度为 77)。

唯一一种跳跃次数最少的可行方案为:从 33 号树出发,直接跳到 66 号树。

因此,minimum_jumps 应该返回 11

考虑另一个调用:

minimum jumps(0, 1, 2, 2)

该计划意味着猩猩必须从 00 号树(高度为 33)或者 11 号树(高度为 22)出发,并最终到达 22 号树(高度为 11)。

由于 22 号树是高度最低的树,所以无法从其他树上跳到 22 号树。

因此,minimum_jumps 应该返回 1-1

【数据范围】

  • 2N2×1052 \le N \le 2 \times {10}^5
  • 1Q1051 \le Q \le {10}^5
  • 1H[i]N1 \le H[i] \le N0iN10 \le i \le N - 1)。
  • H[i]H[j]H[i]\ne H[j]0i<jN10 \le i<j \le N - 1)。
  • 0AB<CDN10 \le A \le B<C \le D \le N - 1

【子任务】

  1. (4 分):H[i]=i+1H[i]=i+10iN10 \le i \le N-1)。
  2. (8 分):N,Q200N,Q \le 200
  3. (13 分):N,Q2000N,Q \le 2000
  4. (12 分):Q5Q \le 5
  5. (23 分):A=BA=BC=DC=D
  6. (21 分):C=DC=D
  7. (19 分):无附加限制。