IOI 2022 Day 1 Task3


Task3


无线电信号塔(towers)

雅加达有 N 个⽆线电信号塔。这些信号塔排布成⼀条直线,并且从左到右依次编号为从 0 到 N − 1。 对 于每个满⾜ 0 ≤ i ≤ N − 1 的 i,信号塔 i 的⾼度为 H[i] ⽶。 所有塔的⾼度都是不同的。

对于某个为正数的信号⼲扰参数 δ,⼀对信号塔 i 和 j (0 ≤ i < j ≤ N − 1) 之间能够互相通信,当且仅 当存在⼀个中间信号塔 k 满⾜如下条件:
塔 i 在塔 k 的左边,并且塔 j 在塔 k 的右边,即 i < k < j;
塔 i 和塔 j 的⾼度都⾄多为 H[k] − δ ⽶。

Pak Dengklek 想租⼀些信号塔来组建他的新⽆线电⽹络。 你的任务是回答 Pak Dengklek 提出的 Q 个询问。这些询问的形式如下: 给定参数 L,R 和 D (0 ≤ L ≤ R ≤ N − 1 且 D > 0),在满⾜下述所有条件时,Pak Dengklek 最多能够租多少个信号塔:
Pak Dengklek 只能租编号在 L 和 R 之间的信号塔(包括 L和 R);
信号⼲扰参数 δ 的值为 D;
Pak Dengklek 租的信号塔两两之间必须能够进⾏通信。

注意,⽆论中间信号塔 k 是否被租,两个已租的信号塔都可以借助信号塔 k 进⾏通信

实现细节

你需要实现以下函数:

void init(int N, int[] H)

N: 信号塔的数量。
H: ⼀个⻓度为 N 的数组,给出信号塔的⾼度。
这个函数恰好被调⽤⼀次,且在函数 max_towers 的所有调⽤之前。

int max_towers(int L, int R, int D)

L, R:信号塔编号区间的边界。
D:信号⼲扰参数 δ 的值。
该函数应返回 Pak Dengklek 最多能租的信号塔数量(⽤于组建信号⽹络),这⾥ Pak Dengklek 只能租 L 和 R之间(包含 L 和 R)的信号塔,且信号⼲扰参数 δ 的值是 D。
该函数将被调⽤恰好 Q 次。

例子

考虑如下函数调⽤序列:

init(7, [10, 20, 60, 40, 50, 30, 70])
max_towers(1, 5, 10)

Pak Dengklek 可以租编号为 1, 3 和 5 的信号塔。 下⾯给出了这个例⼦的⽰意图,其中的灰⾊梯形表示被租的信号塔。
在这里插入图片描述
信号塔 3 和 5 可以借助信号塔 4 进⾏通信,这是因为 40 ≤ 50 − 10 且 30 ≤ 50 − 10。 信号塔 1 和 3 可以借助信号塔 2 进⾏通信。 信号塔 1 和 5 可以借助信号塔 3 进⾏通信。 ⽆法租超过 3 个信号塔,因此 函数应返回 3。

max_towers(2, 2, 100)

在这个区间⾥只有 1 个信号塔,所以 Pak Dengklek 只能租借 1 个信号塔。 因此函数应返回 1。

max_towers(0, 6, 17)

Pak Dengklek 可以租信号塔1 和 3 。 信号塔 1 和 3 可以借助信号塔 2进⾏通信,这是因为 20 ≤ 60 − 17 且 40 ≤ 60 − 17。 ⽆法租赁超过 2 个信号塔,因此函数应返回 2。

约束条件

1 ≤ N ≤ 100 000
1 ≤ Q ≤ 100 000
1 ≤ H[i] ≤ 10 (对于所有满⾜ 0 ≤ i ≤ N − 1 的 i )
H[i] ≠ H[j] (对于所有满⾜ 0 ≤ i < j ≤ N − 1 的 i 和 j )
0 ≤ L ≤ R ≤ N − 1
1 ≤ D ≤ 10^9

⼦任务

  1. (4 分) 存在⼀个满⾜下述所有条件的信号塔 k (0 ≤ k ≤ N − 1)
    对于 0 ≤ i ≤ k − 1的每个i:H[i] < H[i + 1]
    对于 k ≤ i ≤ N − 2的每个i:H[i] > H[i + 1]
  2. (11 分) Q = 1,N ≤ 2000
  3. (12 分) Q = 1
  4. (14 分) D = 1
  5. (17 分) L = 0,R = N − 1
  6. (19 分) D 的值在 max_towers 的所有调⽤中都是相同的
  7. (23 分) 没有额外的限制

评测程序示例

评测程序示例读取如下格式的输⼊:
第 1 ⾏:N Q
第 2 ⾏:H[0] H[1] … H[N − 1]
第 3 + j ⾏(0 ≤ j ≤ Q − 1):L R D(对应第 j 次询问)

评测程序⽰例按照如下的格式打印你的答案:
第 1 + j ⾏(0 ≤ j ≤ Q − 1):max_towers 对第 j 次询问的返回值

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值