#P15672. [Bulgarian2024训练营]逃跑Runaway

    ID: 14884 传统题 1000ms 256MiB 尝试: 1 已通过: 1 难度: 9 上传者: 标签>数据结构单调栈算法基础倍增CF2600

[Bulgarian2024训练营]逃跑Runaway

题目描述

Bobi 住进了一片森林。森林中有 NN 棵树排成一条直线,编号为 00N1N-1。第 ii 棵树的高度为 HiH_i,这些高度互不相同,并且构成 1,2,,N1,2,\ldots,N 的一个排列。

Bobi 站在树 xx 上时,可以跳到某棵树 yy,当且仅当满足下列条件之一:

  • y<xy<xHy>HxH_y>H_x,并且对所有 y<i<xy<i<x,都有 Hi<HxH_i<H_x
  • y>xy>xHy>HxH_y>H_x,并且对所有 x<i<yx<i<y,都有 Hi<HxH_i<H_x

也就是说,他只能跳到左右两侧第一个“能越过中间所有树”的更高树。

现在有 QQ 个询问。每个询问给出四个整数 A,B,C,DA,B,C,D,满足

0AB<CDN1.0\le A\le B<C\le D\le N-1.

Bobi 可以从编号在 [A,B][A,B] 中的任意一棵树开始,最终要到达编号在 [C,D][C,D] 中的任意一棵树。求最少需要多少次跳跃;若无法到达,返回 1-1

实现方式

本题为函数式提交题,需要实现两个函数:

void init(int N, std::vector<int> H);
int minimum_jumps(int A, int B, int C, int D);
  • init 会被调用一次,给出 NN 和高度数组 HH
  • minimum_jumps 会被调用 QQ 次,每次返回对应询问的答案。

数据范围

  • 2N2000002\le N\le 200000
  • 1Q1000001\le Q\le 100000
  • 1HiN1\le H_i\le N
  • HiH_i 两两不同;
  • 0AB<CDN10\le A\le B<C\le D\le N-1

子任务

子任务 分值 NN QQ 额外限制
1 0 - 样例
2 4 200000\le 200000 Hi=i+1H_i=i+1
3 8 200\le 200 -
4 13 2000\le 2000
5 12 200000\le 200000 5\le 5
6 23 200000\le 200000 A=B,C=DA=B, C=D
7 21 C=DC=D
8 19 -

本地测试格式

本地 grader 的输入格式:

  • 第一行:N,QN,Q
  • 第二行:H0,H1,,HN1H_0,H_1,\ldots,H_{N-1}
  • 接下来 QQ 行:A,B,C,DA,B,C,D

样例

输入

7 3
3 2 1 6 4 5 7
4 4 6 6
1 3 5 6
0 1 2 2

输出

2
1
-1

样例解释

三次询问对应的最优跳跃路径分别为:

  1. 4364\to 3\to 6
  2. 363\to 6
  3. 不存在可行路径。

@下发文件