前向窗口内的下一次 depth-jump:在最佳买价深度 tape 上做受限距离比例阈值扫描
Next Depth-Jump within a Forward Window: Bounded-Distance Ratio-Threshold Scan over a Best-Bid-Depth Tape
开始编码实现 solution(bid_depth: list[int], max_distance: int, ratio_threshold: float) -> list[int]。输入 bid_depth 是一段长度为 N 的最佳买价 resting depth tape(每 tick 一个正整数);max_distance(int,>= 1)限定每个下标向前看的 tick 数上限;ratio_threshold(float,严格大于 1)是乘法跳变因子。对每个 tick i(0..N-1),返回到最小下标 j 的前向距离 j - i,要求 j > i AND j - i <= max_distance 且满足 depth-jump 判定 bid_depth[j] >= bid_depth[i] * ratio_threshold;若前向窗口内不存在这样的 j,则返回 -1。
例:solution([4, 5, 8, 6, 12, 4], 3, 1.5) 返回 [2, 1, 2, 1, -1, -1]。逐下标走一遍,cutoff 为 bid_depth[i] * 1.5:tick 0(depth 4,cutoff 6.0)j=1 值 5 不通过(5 < 6.0),j=2 值 8 通过(8 >= 6.0),返回 2;tick 1(depth 5,cutoff 7.5)j=2 值 8 通过,返回 1;tick 2(depth 8,cutoff 12.0)j=3 值 6 不通过,j=4 值 12 通过(12 >= 12.0——边界处采用 strict-or-equal),返回 2;tick 3(depth 6,cutoff 9.0)j=4 值 12 通过,返回 1;tick 4(depth 12,cutoff 18.0)j=5 值 4 不通过,返回 -1;tick 5 在窗口内已无前向下标,返回 -1。
需要明确的细节:答案是窗口内最小的 j(不是第一个值严格大于 bid_depth[i] 的 j);判定式采用 >=(边界 strict-or-equal,按浮点算术对 float 乘积 bid_depth[i] * ratio_threshold 比较);uniform tape 在 r > 1 下全部返回 -1,因为 cutoff v * r > v,窗口内没有前向 depth 能过;严格递减 tape 也全部返回 -1;当 max_distance >= N 时每个 i 都允许扫到 tape 末尾;最后一个下标 N - 1 永远返回 -1(没有前向下标可看);输出列表按位置 精确 整数等于(每项要么为 -1,要么落在 [1, max_distance] 内,不涉及浮点容差)。
朴素地对每个 i 逐位向前扫 max_distance 个 tick 是 O(N * D),在 N = 5000 且 D = N 时内层约 2.5e7 次迭代,每次还要做一次浮点乘——受 timing 闸门的隐藏 large 用例会超过 2 秒。标准做法是右到左扫描,维护一个按下标自队首(最近)到队尾(最远)升序、对应值严格递增的滑窗单调 deque:每个 i 先弹掉队尾出窗的下标,再对队尾的严格递增值数组 bisect cutoff,然后在把 i 推入队首前弹掉被 bid_depth[i] 支配的队首。每次插入/弹出均摊 O(1),bisect 为 O(log N),整体 O(N log N)。这条路径与"下一次更大元素"的朴素扫描显式不同:前向窗口约束意味着不限距离的 next-greater 答案可能落在窗口之外,而严格乘法比例意味着距离更近的"next bigger"可能过不了阈值。
实现细节由 stubs/stub.py 提供。
实践背景
某微结构扫描器从撮合系统拿到逐 tick 的最佳买价 resting depth tape,往往想为每个 tick 标注:在一个短的前向窗口内,下一次 best-bid 的 resting depth 相对当前 depth 出现 乘法因子 r 以上 跳变的 tick——这种"depth-jump"可能意味着 iceberg 重新刷新、隐藏流动性补仓、或者 passive maker 在重新布置一档大单。前向窗口 max_distance 把信号约束在一个可交易的近端时域内(研究侧把更远的 depth 跳变视作与当前 quote 状态脱钩);比例 cutoff r 把 resting depth 上的微抖动(噪声)过滤掉,只留下结构性补仓(depth 抖动 0.1% 不算 jump,3 个 tick 内跳 50% 就大概率算)。受限距离 + 严格乘法比例的组合,正是把这道扫描与"tape 上下一次更大元素"的朴素扫描区分开的关键:不限距离的扫描会把若干秒之外的 depth 跳变也标出来(交易侧并不在乎),不带比例的扫描会把每一次 resting depth 上微小的回升都标出来(信号被噪声淹没)。在多档位的 book replay 上每 tick 朴素扫一遍会让信号提取线程跟不上场内的 tick 流,工程上必须把单 tick 成本压到均摊 O(log N) 或更优。比例边界采用 strict-or-equal 的 >= 是有意为之:恰好落在 bid_depth[i] * r 上的 depth 也算一次 jump(恰好越过阈值的 tick 是信号的边界定义,不是噪声——信号设计者选 >= 而非 > 是为了让阈值本身也算"过"),浮点乘按标准 IEEE-754 语义评估,使比对器在整数 depth tape 与 float ratio 之间良定义。
约束条件
- 1 <= N <= 5000,其中 N 为 solution(bid_depth, max_distance, ratio_threshold) 的输入长度
- 1 <= bid_depth[i] <= 1_000_000(每 tick 最佳买价的 resting depth,正整数,可装入 32 位整数)
- 1 <= max_distance <= N(前向最大回看距离,含端点;可等于 N,相当于把窗口约束放宽到'剩余数组')
- 1.0 < ratio_threshold <= 100.0(严格乘法阈值;以 float 传入)
- 输出为长度为 N 的 list[int];out[i] 要么为 -1,要么落在 [1, max_distance] 内;通过阈值的判定式为 `bid_depth[j] >= bid_depth[i] * ratio_threshold`,按浮点算术评估
- 输出按位置精确比对(整数比较,不使用浮点容差——out[i] 始终是整数)
样例
Case 1 · statement-example: bid_depth [4, 5, 8, 6, 12, 4] D=3 r=1.5
输入: [[4,5,8,6,12,4],3,1.5]
期望: [2,1,2,1,-1,-1]
对每个 i,cutoff = bid_depth[i] * 1.5;i=0 cutoff=6.0,j=1 值 5 不通过,j=2 值 8 通过 -> 2;i=1 cutoff=7.5,j=2 值 8 通过 -> 1;i=2 cutoff=12.0,j=3 值 6 不通过,j=4 值 12 通过 -> 2;i=3 cutoff=9.0,j=4 值 12 通过 -> 1;i=4 cutoff=18.0 窗口内无人通过 -> -1;i=5 无前向 -> -1。
Case 2 · typical: strictly-increasing tape with mild ratio r=1.001
输入: [[10,20,30,40,50],4,1.001]
期望: [1,1,1,1,-1]
严格递增 tape;cutoff 仅比 bid_depth[i] 高 0.1%,因此每个 i 的下一个 tick 都通过,全部返回 1(最末项除外)。
Case 3 · typical: closer next-bigger fails ratio, farther one passes
输入: [[4,5,10,1,1],4,2]
期望: [2,1,-1,-1,-1]
i=0 cutoff=8.0,j=1 值 5 不通过(虽然大于 4),j=2 值 10 通过 -> 2;i=1 cutoff=10.0,j=2 值 10 通过(边界 strict-or-equal)-> 1;其它无人通过 -> -1。
Case 4 · typical: qualifying j lies beyond max_distance window
输入: [[1,1,1,100],2,1.5]
期望: [-1,2,1,-1]
i=0 D=2 只能看 j=1,2 都是 1,不通过 -> -1(j=3 的 100 已出窗);i=1 看 j=2 不通过、j=3 通过 -> 2;i=2 看 j=3 通过 -> 1;i=3 -> -1。
Case 5 · typical: rough depth tape with mixed jumps and dips
输入: [[3,2,6,5,4,9,1],5,1.5]
期望: [2,1,3,2,1,-1,-1]
走一遍:i=0 cutoff=4.5,j=1=2 不通过,j=2=6 通过 -> 2;i=1 cutoff=3.0,j=2=6 通过 -> 1;i=2 cutoff=9.0,j=3=5 不通过、j=4=4 不通过、j=5=9 通过 -> 3;i=3 cutoff=7.5,j=4=4 不通过、j=5=9 通过 -> 2;i=4 cutoff=6.0,j=5=9 通过 -> 1;i=5 cutoff=13.5,j=6=1 不通过 -> -1;i=6 -> -1。
Case 6 · typical: depth tape with plateau around the threshold boundary
输入: [[10,10,15,15,30],4,1.5]
期望: [2,1,2,1,-1]
i=0 cutoff=15.0,j=1=10 不通过、j=2=15 通过(边界)-> 2;i=1 cutoff=15.0,j=2=15 通过(边界)-> 1;i=2 cutoff=22.5,j=3=15 不通过、j=4=30 通过 -> 2;i=3 cutoff=22.5,j=4=30 通过 -> 1;i=4 -> -1。
Case 7 · typical: high ratio r=3.0 filters out mild bumps
输入: [[10,12,14,16,18,20,60,5],7,3]
期望: [6,5,4,3,2,1,-1,-1]
前几个下标的 cutoff 在 30 以上,前向需要等到 j=6=60;i=0 cutoff=30,j=6=60 在 D=7 内 -> 6;i=1 cutoff=36,j=6=60 通过 -> 5;i=2 cutoff=42,j=6=60 通过 -> 4;i=3 cutoff=48,j=6=60 通过 -> 3;i=4 cutoff=54,j=6=60 通过 -> 2;i=5 cutoff=60,j=6=60 通过(边界)-> 1;i=6 cutoff=180,j=7=5 不通过 -> -1;i=7 -> -1。
Case 8 · typical: sawtooth depth pattern with D=3
输入: [[5,1,7,1,9,1,11],3,1.5]
期望: [-1,1,-1,1,-1,1,-1]
i=0 cutoff=7.5,j=1=1 不通过、j=2=7 不通过(7<7.5)、j=3=1 不通过 -> -1;i=1 cutoff=1.5,j=2=7 通过 -> 1;i=2 cutoff=10.5,j=3=1、j=4=9、j=5=1 不通过 -> -1;i=3 cutoff=1.5,j=4=9 通过 -> 1;i=4 cutoff=13.5,j=5=1、j=6=11 不通过 -> -1;i=5 cutoff=1.5,j=6=11 通过 -> 1;i=6 -> -1。
Case 9 · boundary: N=1 single tick returns [-1]
输入: [[42],1,2]
期望: [-1]
只有一个 tick,没有前向位置 -> [-1]。
Case 10 · boundary: N=2 second tick passes ratio
输入: [[10,25],1,2]
期望: [1,-1]
i=0 cutoff=20.0,j=1 值 25 通过 -> 1;i=1 -> -1。
Case 11 · boundary: N=2 second tick fails ratio
输入: [[10,19],1,2]
期望: [-1,-1]
i=0 cutoff=20.0,j=1 值 19 不通过 -> -1;i=1 -> -1。
Case 12 · boundary: uniform tape with r > 1 returns all -1
输入: [[7,7,7,7,7,7,7],6,1.001]
期望: [-1,-1,-1,-1,-1,-1,-1]
tape 全 7,cutoff=7.007,没有任何前向值能通过 -> 全 -1。
Case 13 · boundary: r at the upper bound 100.0
输入: [[1,50,100,50,1],4,100]
期望: [2,-1,-1,-1,-1]
i=0 cutoff=100.0,j=2=100 通过(边界)-> 2;i=1 cutoff=5000,无人通过 -> -1;i=2 cutoff=10000,无人通过 -> -1;i=3 cutoff=5000,无人通过 -> -1;i=4 -> -1。
Case 14 · boundary: r very close to 1 (1.001) — tiny jumps qualify
输入: [[100,101,100,101,100],4,1.001]
期望: [1,-1,1,-1,-1]
cutoff = bid * 1.001。i=0 cutoff=100.1,j=1=101 通过 -> 1;i=1 cutoff=101.101,j=2=100、j=3=101、j=4=100 都不通过 -> -1;i=2 cutoff=100.1,j=3=101 通过 -> 1;i=3 cutoff=101.101,j=4=100 不通过 -> -1;i=4 -> -1。
Case 15 · boundary: D=1 only the immediate next tick is allowed
输入: [[3,9,4,13,5],1,2]
期望: [1,-1,1,-1,-1]
D=1,每个 i 仅看 j=i+1。i=0 cutoff=6.0,j=1=9 通过 -> 1;i=1 cutoff=18.0,j=2=4 不通过 -> -1;i=2 cutoff=8.0,j=3=13 通过 -> 1;i=3 cutoff=26.0,j=4=5 不通过 -> -1;i=4 -> -1。
Case 16 · boundary: D equals N (full forward reach)
输入: [[2,1,1,1,8],5,2]
期望: [4,3,2,1,-1]
D=N=5。i=0 cutoff=4.0,j=1..3=1 不通过、j=4=8 通过 -> 4;i=1 cutoff=2.0,j=2=1、j=3=1 不通过、j=4=8 通过 -> 3;i=2 cutoff=2.0,j=3=1 不通过、j=4=8 通过 -> 2;i=3 cutoff=2.0,j=4=8 通过 -> 1;i=4 -> -1。
Case 17 · boundary: depths near upper bound 1_000_000
输入: [[1000000,999999,1000000,1,1000000],4,1.5]
期望: [-1,-1,-1,1,-1]
i=0 cutoff=1.5e6,前向无人通过 -> -1;i=1 cutoff~=1499998.5,前向无人通过 -> -1;i=2 cutoff=1.5e6,前向无人通过 -> -1;i=3 cutoff=1.5,j=4=1e6 通过 -> 1;i=4 -> -1。
Case 18 · boundary: strictly-decreasing tape returns all -1
输入: [[50,40,30,20,10,5,1],6,1.001]
期望: [-1,-1,-1,-1,-1,-1,-1]
严格递减 tape,前向值始终更小,cutoff 又严格大于当前 -> 全 -1。
Case 19 · adversarial: vanilla next-greater would pick j=1 but ratio cutoff requires j=3
输入: [[10,11,12,25,9,9],5,2]
期望: [3,2,1,-1,-1,-1]
i=0 cutoff=20.0:j=1=11 大于 10 但不过 ratio,j=2=12 同样不过,j=3=25 通过 -> 3;vanilla next-greater 会错给 1。i=1 cutoff=22.0,j=2=12 不过、j=3=25 通过 -> 2;i=2 cutoff=24.0,j=3=25 通过 -> 1;i=3 cutoff=50.0,j=4=9、j=5=9 不过 -> -1;其余 -> -1。
Case 20 · adversarial: passing j exists but beyond max_distance
输入: [[10,5,5,5,5,50],3,2]
期望: [-1,-1,3,2,1,-1]
i=0 D=3,j 范围 1..3 全是 5,不通过;j=5=50 在 D=3 之外 -> -1(不限距离的 next-greater 会错给 5);i=1 cutoff=10.0,j=2..4=5 不通过、j=5 距离=4 超过 D=3 -> -1;i=2 cutoff=10.0,j=3=5 j=4=5 不通过、j=5=50 距离=3 在窗口内 -> 3;i=3 cutoff=10.0,j=4=5 不通过、j=5=50 距离=2 -> 2;i=4 cutoff=10.0,j=5=50 距离=1 -> 1;i=5 -> -1。
Case 21 · adversarial: closer larger fails ratio, farther passing is exactly at the D edge
输入: [[10,15,12,14,30],4,2]
期望: [4,3,2,1,-1]
i=0 cutoff=20.0:j=1=15、j=2=12、j=3=14 都不通过;j=4=30 通过且距离 4 == D -> 4;i=1 cutoff=30.0,j=2 j=3 不通过、j=4=30 通过(边界)-> 3;i=2 cutoff=24.0,j=3=14 不通过、j=4=30 通过 -> 2;i=3 cutoff=28.0,j=4=30 通过 -> 1;i=4 -> -1。
Case 22 · adversarial: long plateau followed by a single jump just inside D
输入: [[3,3,3,3,3,3,3,3,9,3],8,2.5]
期望: [8,7,6,5,4,3,2,1,-1,-1]
前 8 个 3 后接 9 再接 3,cutoff=7.5,jump 仅由 9 提供。i=0 D=8,最远 j=8 是 9,通过 -> 8(恰好 D 边界);i=1 j=8=9 通过 -> 7;以此类推 i=2..7 给出 6,5,4,3,2,1;i=8 cutoff=22.5,j=9=3 不通过 -> -1;i=9 -> -1。
Case 23 · adversarial: repeated boundary-equal values exercise the strict-or-equal `>=`
输入: [[4,6,6,6,6,6,9],6,1.5]
期望: [1,5,4,3,2,1,-1]
i=0 cutoff=6.0,j=1=6 通过(边界 strict-or-equal)-> 1;i=1..5 cutoff=9.0;i=1 j=6=9 通过 -> 5;i=2 -> 4;i=3 -> 3;i=4 -> 2;i=5 -> 1;i=6 -> -1。
Case 24 · adversarial: tape where every closer non-passing forward index is larger than i but below cutoff
输入: [[10,19,19,19,21,5],5,2]
期望: [4,-1,-1,-1,-1,-1]
i=0 cutoff=20.0,j=1..3=19 全部小于 cutoff(虽然都大于 10)-> 不过;j=4=21 通过 -> 4;i=1 cutoff=38.0,j=2..3=19、j=4=21 不过、j=5=5 不过 -> -1;i=2 cutoff=38.0,类似 -> -1;i=3 cutoff=38.0 -> -1;i=4 cutoff=42.0 -> -1;i=5 -> -1。
Case 25 · adversarial: many close-but-failing depth bumps with one mega-jump
输入: [[10,11,12,13,14,15,16,17,18,50],9,2.5]
期望: [9,8,7,6,5,4,3,2,1,-1]
前面每个相邻 bump 都 < 当前 * 2.5,最后跳到 50 才通过。每个 i 都需要扫到 j=9=50。i=0 cutoff=25,距离=9(D=9)-> 9;i=1 cutoff=27.5,距离=8 -> 8;... i=8 cutoff=45,距离=1 -> 1;i=9 -> -1。
Case 26 · adversarial: D=1 tight window with alternating boundary passes
输入: [[1,2,4,4,8,16,32,1],1,2]
期望: [1,1,-1,1,1,1,-1,-1]
D=1 每次只看下一个 tick。i=0 cutoff=2.0,j=1=2 通过(边界)-> 1;i=1 cutoff=4.0,j=2=4 通过(边界)-> 1;i=2 cutoff=8.0,j=3=4 不通过 -> -1;i=3 cutoff=8.0,j=4=8 通过(边界)-> 1;i=4 cutoff=16.0,j=5=16 通过(边界)-> 1;i=5 cutoff=32.0,j=6=32 通过(边界)-> 1;i=6 cutoff=64.0,j=7=1 不通过 -> -1;i=7 -> -1。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · statement-example: bid_depth [4, 5, 8, 6, 12, 4] D=3 r=1.5
输入: [[4,5,8,6,12,4],3,1.5]
期望: [2,1,2,1,-1,-1]
对每个 i,cutoff = bid_depth[i] * 1.5;i=0 cutoff=6.0,j=1 值 5 不通过,j=2 值 8 通过 -> 2;i=1 cutoff=7.5,j=2 值 8 通过 -> 1;i=2 cutoff=12.0,j=3 值 6 不通过,j=4 值 12 通过 -> 2;i=3 cutoff=9.0,j=4 值 12 通过 -> 1;i=4 cutoff=18.0 窗口内无人通过 -> -1;i=5 无前向 -> -1。
Case 2 · typical: strictly-increasing tape with mild ratio r=1.001
输入: [[10,20,30,40,50],4,1.001]
期望: [1,1,1,1,-1]
严格递增 tape;cutoff 仅比 bid_depth[i] 高 0.1%,因此每个 i 的下一个 tick 都通过,全部返回 1(最末项除外)。
Case 3 · typical: closer next-bigger fails ratio, farther one passes
输入: [[4,5,10,1,1],4,2]
期望: [2,1,-1,-1,-1]
i=0 cutoff=8.0,j=1 值 5 不通过(虽然大于 4),j=2 值 10 通过 -> 2;i=1 cutoff=10.0,j=2 值 10 通过(边界 strict-or-equal)-> 1;其它无人通过 -> -1。
Case 4 · typical: qualifying j lies beyond max_distance window
输入: [[1,1,1,100],2,1.5]
期望: [-1,2,1,-1]
i=0 D=2 只能看 j=1,2 都是 1,不通过 -> -1(j=3 的 100 已出窗);i=1 看 j=2 不通过、j=3 通过 -> 2;i=2 看 j=3 通过 -> 1;i=3 -> -1。
Case 5 · typical: rough depth tape with mixed jumps and dips
输入: [[3,2,6,5,4,9,1],5,1.5]
期望: [2,1,3,2,1,-1,-1]
走一遍:i=0 cutoff=4.5,j=1=2 不通过,j=2=6 通过 -> 2;i=1 cutoff=3.0,j=2=6 通过 -> 1;i=2 cutoff=9.0,j=3=5 不通过、j=4=4 不通过、j=5=9 通过 -> 3;i=3 cutoff=7.5,j=4=4 不通过、j=5=9 通过 -> 2;i=4 cutoff=6.0,j=5=9 通过 -> 1;i=5 cutoff=13.5,j=6=1 不通过 -> -1;i=6 -> -1。
Case 6 · typical: depth tape with plateau around the threshold boundary
输入: [[10,10,15,15,30],4,1.5]
期望: [2,1,2,1,-1]
i=0 cutoff=15.0,j=1=10 不通过、j=2=15 通过(边界)-> 2;i=1 cutoff=15.0,j=2=15 通过(边界)-> 1;i=2 cutoff=22.5,j=3=15 不通过、j=4=30 通过 -> 2;i=3 cutoff=22.5,j=4=30 通过 -> 1;i=4 -> -1。
Case 7 · typical: high ratio r=3.0 filters out mild bumps
输入: [[10,12,14,16,18,20,60,5],7,3]
期望: [6,5,4,3,2,1,-1,-1]
前几个下标的 cutoff 在 30 以上,前向需要等到 j=6=60;i=0 cutoff=30,j=6=60 在 D=7 内 -> 6;i=1 cutoff=36,j=6=60 通过 -> 5;i=2 cutoff=42,j=6=60 通过 -> 4;i=3 cutoff=48,j=6=60 通过 -> 3;i=4 cutoff=54,j=6=60 通过 -> 2;i=5 cutoff=60,j=6=60 通过(边界)-> 1;i=6 cutoff=180,j=7=5 不通过 -> -1;i=7 -> -1。
Case 8 · typical: sawtooth depth pattern with D=3
输入: [[5,1,7,1,9,1,11],3,1.5]
期望: [-1,1,-1,1,-1,1,-1]
i=0 cutoff=7.5,j=1=1 不通过、j=2=7 不通过(7<7.5)、j=3=1 不通过 -> -1;i=1 cutoff=1.5,j=2=7 通过 -> 1;i=2 cutoff=10.5,j=3=1、j=4=9、j=5=1 不通过 -> -1;i=3 cutoff=1.5,j=4=9 通过 -> 1;i=4 cutoff=13.5,j=5=1、j=6=11 不通过 -> -1;i=5 cutoff=1.5,j=6=11 通过 -> 1;i=6 -> -1。
Case 9 · boundary: N=1 single tick returns [-1]
输入: [[42],1,2]
期望: [-1]
只有一个 tick,没有前向位置 -> [-1]。
Case 10 · boundary: N=2 second tick passes ratio
输入: [[10,25],1,2]
期望: [1,-1]
i=0 cutoff=20.0,j=1 值 25 通过 -> 1;i=1 -> -1。
Case 11 · boundary: N=2 second tick fails ratio
输入: [[10,19],1,2]
期望: [-1,-1]
i=0 cutoff=20.0,j=1 值 19 不通过 -> -1;i=1 -> -1。
Case 12 · boundary: uniform tape with r > 1 returns all -1
输入: [[7,7,7,7,7,7,7],6,1.001]
期望: [-1,-1,-1,-1,-1,-1,-1]
tape 全 7,cutoff=7.007,没有任何前向值能通过 -> 全 -1。
Case 13 · boundary: r at the upper bound 100.0
输入: [[1,50,100,50,1],4,100]
期望: [2,-1,-1,-1,-1]
i=0 cutoff=100.0,j=2=100 通过(边界)-> 2;i=1 cutoff=5000,无人通过 -> -1;i=2 cutoff=10000,无人通过 -> -1;i=3 cutoff=5000,无人通过 -> -1;i=4 -> -1。
Case 14 · boundary: r very close to 1 (1.001) — tiny jumps qualify
输入: [[100,101,100,101,100],4,1.001]
期望: [1,-1,1,-1,-1]
cutoff = bid * 1.001。i=0 cutoff=100.1,j=1=101 通过 -> 1;i=1 cutoff=101.101,j=2=100、j=3=101、j=4=100 都不通过 -> -1;i=2 cutoff=100.1,j=3=101 通过 -> 1;i=3 cutoff=101.101,j=4=100 不通过 -> -1;i=4 -> -1。
Case 15 · boundary: D=1 only the immediate next tick is allowed
输入: [[3,9,4,13,5],1,2]
期望: [1,-1,1,-1,-1]
D=1,每个 i 仅看 j=i+1。i=0 cutoff=6.0,j=1=9 通过 -> 1;i=1 cutoff=18.0,j=2=4 不通过 -> -1;i=2 cutoff=8.0,j=3=13 通过 -> 1;i=3 cutoff=26.0,j=4=5 不通过 -> -1;i=4 -> -1。
Case 16 · boundary: D equals N (full forward reach)
输入: [[2,1,1,1,8],5,2]
期望: [4,3,2,1,-1]
D=N=5。i=0 cutoff=4.0,j=1..3=1 不通过、j=4=8 通过 -> 4;i=1 cutoff=2.0,j=2=1、j=3=1 不通过、j=4=8 通过 -> 3;i=2 cutoff=2.0,j=3=1 不通过、j=4=8 通过 -> 2;i=3 cutoff=2.0,j=4=8 通过 -> 1;i=4 -> -1。
Case 17 · boundary: depths near upper bound 1_000_000
输入: [[1000000,999999,1000000,1,1000000],4,1.5]
期望: [-1,-1,-1,1,-1]
i=0 cutoff=1.5e6,前向无人通过 -> -1;i=1 cutoff~=1499998.5,前向无人通过 -> -1;i=2 cutoff=1.5e6,前向无人通过 -> -1;i=3 cutoff=1.5,j=4=1e6 通过 -> 1;i=4 -> -1。
Case 18 · boundary: strictly-decreasing tape returns all -1
输入: [[50,40,30,20,10,5,1],6,1.001]
期望: [-1,-1,-1,-1,-1,-1,-1]
严格递减 tape,前向值始终更小,cutoff 又严格大于当前 -> 全 -1。
Case 19 · adversarial: vanilla next-greater would pick j=1 but ratio cutoff requires j=3
输入: [[10,11,12,25,9,9],5,2]
期望: [3,2,1,-1,-1,-1]
i=0 cutoff=20.0:j=1=11 大于 10 但不过 ratio,j=2=12 同样不过,j=3=25 通过 -> 3;vanilla next-greater 会错给 1。i=1 cutoff=22.0,j=2=12 不过、j=3=25 通过 -> 2;i=2 cutoff=24.0,j=3=25 通过 -> 1;i=3 cutoff=50.0,j=4=9、j=5=9 不过 -> -1;其余 -> -1。
Case 20 · adversarial: passing j exists but beyond max_distance
输入: [[10,5,5,5,5,50],3,2]
期望: [-1,-1,3,2,1,-1]
i=0 D=3,j 范围 1..3 全是 5,不通过;j=5=50 在 D=3 之外 -> -1(不限距离的 next-greater 会错给 5);i=1 cutoff=10.0,j=2..4=5 不通过、j=5 距离=4 超过 D=3 -> -1;i=2 cutoff=10.0,j=3=5 j=4=5 不通过、j=5=50 距离=3 在窗口内 -> 3;i=3 cutoff=10.0,j=4=5 不通过、j=5=50 距离=2 -> 2;i=4 cutoff=10.0,j=5=50 距离=1 -> 1;i=5 -> -1。
Case 21 · adversarial: closer larger fails ratio, farther passing is exactly at the D edge
输入: [[10,15,12,14,30],4,2]
期望: [4,3,2,1,-1]
i=0 cutoff=20.0:j=1=15、j=2=12、j=3=14 都不通过;j=4=30 通过且距离 4 == D -> 4;i=1 cutoff=30.0,j=2 j=3 不通过、j=4=30 通过(边界)-> 3;i=2 cutoff=24.0,j=3=14 不通过、j=4=30 通过 -> 2;i=3 cutoff=28.0,j=4=30 通过 -> 1;i=4 -> -1。
Case 22 · adversarial: long plateau followed by a single jump just inside D
输入: [[3,3,3,3,3,3,3,3,9,3],8,2.5]
期望: [8,7,6,5,4,3,2,1,-1,-1]
前 8 个 3 后接 9 再接 3,cutoff=7.5,jump 仅由 9 提供。i=0 D=8,最远 j=8 是 9,通过 -> 8(恰好 D 边界);i=1 j=8=9 通过 -> 7;以此类推 i=2..7 给出 6,5,4,3,2,1;i=8 cutoff=22.5,j=9=3 不通过 -> -1;i=9 -> -1。
Case 23 · adversarial: repeated boundary-equal values exercise the strict-or-equal `>=`
输入: [[4,6,6,6,6,6,9],6,1.5]
期望: [1,5,4,3,2,1,-1]
i=0 cutoff=6.0,j=1=6 通过(边界 strict-or-equal)-> 1;i=1..5 cutoff=9.0;i=1 j=6=9 通过 -> 5;i=2 -> 4;i=3 -> 3;i=4 -> 2;i=5 -> 1;i=6 -> -1。
Case 24 · adversarial: tape where every closer non-passing forward index is larger than i but below cutoff
输入: [[10,19,19,19,21,5],5,2]
期望: [4,-1,-1,-1,-1,-1]
i=0 cutoff=20.0,j=1..3=19 全部小于 cutoff(虽然都大于 10)-> 不过;j=4=21 通过 -> 4;i=1 cutoff=38.0,j=2..3=19、j=4=21 不过、j=5=5 不过 -> -1;i=2 cutoff=38.0,类似 -> -1;i=3 cutoff=38.0 -> -1;i=4 cutoff=42.0 -> -1;i=5 -> -1。
Case 25 · adversarial: many close-but-failing depth bumps with one mega-jump
输入: [[10,11,12,13,14,15,16,17,18,50],9,2.5]
期望: [9,8,7,6,5,4,3,2,1,-1]
前面每个相邻 bump 都 < 当前 * 2.5,最后跳到 50 才通过。每个 i 都需要扫到 j=9=50。i=0 cutoff=25,距离=9(D=9)-> 9;i=1 cutoff=27.5,距离=8 -> 8;... i=8 cutoff=45,距离=1 -> 1;i=9 -> -1。
Case 26 · adversarial: D=1 tight window with alternating boundary passes
输入: [[1,2,4,4,8,16,32,1],1,2]
期望: [1,1,-1,1,1,1,-1,-1]
D=1 每次只看下一个 tick。i=0 cutoff=2.0,j=1=2 通过(边界)-> 1;i=1 cutoff=4.0,j=2=4 通过(边界)-> 1;i=2 cutoff=8.0,j=3=4 不通过 -> -1;i=3 cutoff=8.0,j=4=8 通过(边界)-> 1;i=4 cutoff=16.0,j=5=16 通过(边界)-> 1;i=5 cutoff=32.0,j=6=32 通过(边界)-> 1;i=6 cutoff=64.0,j=7=1 不通过 -> -1;i=7 -> -1。