#3843. 兔猫信奥学院的“隐形长度”搜索-暂不用

兔猫信奥学院的“隐形长度”搜索-暂不用

🐰🐱 题目描述

兔猫信奥学院的神秘藏宝洞中,藏着一条按严格升序排列的宝石序列 secret,但小兔和小猫只能通过时空窥探装置 ArrayReader 访问第 i 号宝石的编号:

  • 调用 ArrayReader.get(i) 返回 secret[i]
  • 如果 i 超出了真实长度,则返回一个大数(视为 “无穷大”)。

加菲老师对他们说:

“你不知道序列的长度,只能借助 ArrayReader.get(i)。给定一个目标编号 target,如果在序列中存在,返回它的下标;否则返回 –1。必须在平均或最坏 \(O(\log n)\) 的时间内完成!”

小兔想到:“先用指数探测快速找到一个上界 high,再在 [low,high] 上做二分!”
小猫点头:“没错,完美符合 \(O(\log n)\)!”


📥 输入格式

为了在信息学奥赛中模拟这个过程,实际输入我们这样设计:

第一行:整数 n, target  
第二行:n 个整数 secret[0..n-1],严格升序
  • \(1 \le n \le 10^4\)
  • (104secret[i],  target104)(-10^4 \le secret[i],\;target \le 10^4)
  • secret 严格递增

注意:虽然输入给了 n,在解题时你不得直接使用它,必须通过模拟的 ArrayReader.get(i) 来访问元素或检测越界。


📤 输出格式

一个整数:目标 target 在序列中的下标(0~n-1),若不存在则输出 -1

💡 输入输出样例

样例 1

6 9
-1 0 3 5 9 12
4

调用 get(4) 可以获得 9。

样例 2

6 2
-1 0 3 5 9 12
-1

序列中无 2。


📊 数据范围

  • 隐藏长度 \(n\le10^4\),调用 ArrayReader.get 总次数需 O(logn)O(\log n)
  • 元素与 target 在区间 [104,104][-10^4,10^4]