loj#P3832. 「IOI2022」无线电信号塔
「IOI2022」无线电信号塔
注意事项
在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:
- C++(标准为 C++ 11 及以上)
请在提交源代码前添加 #include "towers.h"
。
题目描述
雅加达有 个无线电信号塔。这些信号塔排布成一条直线,并且从左到右依次编号为从 到 。 对于每个满足 的 ,信号塔 的高度为 米。 所有塔的高度都是不同的。
对于某个为正数的信号干扰参数 ,一对信号塔 和 () 之间能够互相通信,当且仅当存在一个中间信号塔 满足如下条件:
- 塔 在塔 的左边,并且塔 在塔 的右边,即 ;
- 塔 和塔 的高度都至多为 米。
Pak Dengklek 想租一些信号塔来组建他的新无线电网络。 你的任务是回答 Pak Dengklek 提出的 个询问。这些询问的形式如下: 给定参数 和 ( 且 ),在满足下述所有条件时,Pak Dengklek 最多能够租多少个信号塔:
- Pak Dengklek 只能租编号在 和 之间的信号塔(包括 和 );
- 信号干扰参数 的值为 ;
- Pak Dengklek 租的信号塔两两之间必须能够进行通信。
注意,无论中间信号塔 是否被租,两个已租的信号塔都可以借助信号塔 进行通信。
实现细节
你需要实现以下函数:
void init(int N, int[] H)
- : 信号塔的数量。
- : 一个长度为 的数组,给出信号塔的高度。
- 这个函数恰好被调用一次,且在函数
max_towers
的所有调用之前。
int max_towers(int L, int R, int D)
- , :信号塔编号区间的边界。
- :信号干扰参数 的值。
- 该函数应返回 Pak Dengklek 最多能租的信号塔数量(用于组建信号网络),这里 Pak Dengklek 只能租 和 之间(包含 和 )的信号塔,且信号干扰参数 的值是 。
- 该函数将被调用恰好 次。
例子
考虑如下函数调⽤序列:
init(7, [10, 20, 60, 40, 50, 30, 70])
max_towers(1, 5, 10)
Pak Dengklek 可以租编号为 , 和 的信号塔。 下面给出了这个例子的示意图,其中的灰色梯形表示被租的信号塔。
信号塔 和 可以借助信号塔 进行通信,这是因为 且 。 信号塔 和 可以借助信号塔 进行通信。 信号塔 和 可以借助信号塔 进行通信。 无法租超过 个信号塔,因此函数应返回 。
max_towers(2, 2, 100)
在这个区间里只有 个信号塔,所以 Pak Dengklek 只能租借 个信号塔。 因此函数应返回 。
max_towers(0, 6, 17)
Pak Dengklek 可以租信号塔 和 。 信号塔 和 可以借助信号塔 进行通信,这是因为 且 。 无法租赁超过 个信号塔,因此函数应返回 。
约束条件
- (对于所有满足 的 )
- (对于所有满足 的 和 )
子任务
- (4 分) 存在一个满足下述所有条件的信号塔 ()
- 对于 的每个 :
- 对于 的每个 :
- (11 分) ,
- (12 分)
- (14 分)
- (17 分) ,
- (19 分) 的值在
max_towers
的所有调用中都是相同的 - (23 分) 没有额外的限制
评测程序示例
评测程序示例读取如下格式的输入:
- 第 行:
- 第 行:
- 第 行():(对应第 次询问)
评测程序示例按照如下的格式打印你的答案:
- 第 行():
max_towers
对第 次询问的返回值
约定
题面在给出函数接口时,会使用一般性的类型名称 void
、int
、int64
、int[]
(数组)和 int[][]
(数组的数组)。
在 C++ 中,评测程序会采用适当的数据类型或实现,如下表所示:
void |
int |
int64 |
int[] |
---|---|---|---|
void |
int |
long long |
std::vector<int> |
int[][] |
数组 a 的长度 |
---|---|
std::vector<std::vector<int>> |
a.size() |