← 返回编程题库
coding-running-unbroken-bid-stack-sum中等免费版2000ms未尝试

仍未被击穿的买价栈累加和:当下尚未被覆盖的支撑层合计

Running Unbroken-Bid Stack Sum: Cumulative Support of Still-Standing Prior Bids

开始编码

实现 solution(bids: list[int]) -> list[int]。给定长度为 N 的逐 tick best-bid 正整数指示数组 bids,维护一根从栈底到栈顶严格递减的历史 bid 值栈,以及一个累加器 stack_sum。对每个 tick i(0 <= i < N),把 bids[i] 入栈,返回 output[i] = 入栈后立即读取到的 stack_sum。

具体处理:当栈非空且栈顶 <= bids[i] 时,反复弹出栈顶(同时把弹出值从 stack_sum 减掉);随后把 bids[i] 入栈(把它加入 stack_sum);最后记录 output[i] = stack_sum。这根栈追踪的是"尚未被击穿"的历史 bid——它们尚未被任何后来的等值或更强 bid 覆盖;这个累加器记录的就是当前 tick 下整个未被击穿的支撑层合计。

例:solution([4, 3, 5, 2, 1]) 返回 [4, 7, 5, 7, 8]。i=0 入栈 4,sum=4;i=1 入栈 3(4>3 不弹出),sum=4+3=7;i=2 新值 5 把 3 与 4 都弹出(都 <= 5),随后 5 入栈,栈变为 [5],sum=5;i=3 入栈 2(5>2 不弹出),sum=5+2=7;i=4 入栈 1(2>1 不弹出),sum=7+1=8。

需要明确的细节:长度为 1 的输入返回 [bids[0]](只包含刚入栈的那个元素);严格递减输入下不会发生任何弹出,输出即 bids 的前缀累计和;严格递增输入下每次入栈会把整根栈弹空,因此每个 tick 都有 output[i] = bids[i];等值连跑(例如 [5, 5, 5])由于严格递减不变式,每个新等值会把先前的等值弹出,栈始终大小为 1,输出为 [5, 5, 5]。输入数组至少包含一个元素(1 <= N <= 5000)。输出按位置使用精确整数比对(不使用浮点容差)。

直接做朴素方案:在每个 tick i 都从头扫描历史、重新计算"未被击穿"的支撑集合,最坏情况是 O(N^2)(例如长降序段会让支撑集合线性增长)。标准做法是在所有 tick 之间共享一根严格递减的栈,并对 stack_sum 做增量维护:每个元素只入栈一次、出栈至多一次,每 tick 均摊 O(1)、整体 O(N)。

实现细节由 stubs/stub.py 提供。

针对 bids = [4, 3, 5, 2, 1] 的逐步推演:

| i | bids[i] | 弹出(从 stack_sum 减去) | 入栈后的栈 | stack_sum = output[i] | | -: | -: | :- | :- | -: | | 0 | 4 | (无) | [4] | 4 | | 1 | 3 | (无,4 > 3) | [4, 3] | 7 | | 2 | 5 | 弹出 3,弹出 4 | [5] | 5 | | 3 | 2 | (无,5 > 2) | [5, 2] | 7 | | 4 | 1 | (无,2 > 1) | [5, 2, 1] | 8 |

output[1]=7output[2]=5 的下跌就是关键诊断时刻——一个新出现的 bid 5 正好把先前两层(3 与 4)的支撑全部击穿,只剩它自己留在栈里。

实践背景

逐 tick best-bid 流上的一个微结构特征:用"仍未被击穿的栈累加和"作为快速复合的"完整支撑"指示。tick i 时刻的严格递减栈,代表的是尚未被任何后来等值或更强 bid 覆盖的历史 bid 链——它们是当前报价之下"仍然挺立"的支撑层。把这些值求和并按 tick 推送出去,得到一条单值序列,它具有几个有特点的行为:

  • 在长降序或盘整段单调上升(每个新 bid 都没有越过之前的任何 bid,会被简单地加到栈上,累加器持续累加)。
  • 在某个新 bid 击穿一层或多层旧支撑时急剧下跌(被弹出层的贡献会从累加器中减掉,下跌幅度等于被覆盖的支撑总量)。
  • 不会跌破当前 bid 自身(output[i] 至少为 bids[i],因为刚入栈的元素一定计入累加器),因此一次扫荡也不会让指标低于当前报价。

研究侧会同时从两端来读这条序列:持续上升说明报价之下叠了多层尚未被挑战的支撑(许多历史 bid 静静地停留在等于或更低位置);序列陡崖式下跌则是一次扫荡——一个 bid 直接把一组先前支撑层覆盖掉,跌幅就是被覆盖那部分的合计权重。在每个 tick 都从头重新统计支撑集合是 O(N^2),当 N 上升到几千 tick 后会让指标线程跟不上行情;工程目标是每步均摊 O(1)。"等值栈顶被弹出"的严格递减不变式是有意为之:同一价位上的重复 bid 不应被当作新的一层支撑加入,避免重复 print 把累加器虚抬、触发虚假的支撑增厚信号。

约束条件

  • 1 <= N <= 5000,其中 N 为 solution(bids) 的输入长度
  • 1 <= bids[i] <= 1000000(每个 tick 上的 best-bid 指标,正整数)
  • 输出为长度 N 的 list[int],其中 output[i] 是入栈 bids[i] 之后立刻读取到的 stack_sum
  • 栈始终保持严格递减——等值的旧栈顶在新元素入栈前会被弹出
  • 输出按位置使用精确整数比对(不使用浮点容差)

样例

Case 1 · statement-example: 5-tick mixed sequence

输入: [[4,3,5,2,1]]

期望: [4,7,5,7,8]

i=0 入栈 4,sum=4;i=1 入栈 3(不弹出),sum=7;i=2 入 5 弹出 3 与 4,sum=5;i=3 入栈 2,sum=7;i=4 入栈 1,sum=8。

Case 2 · visible: strictly decreasing yields cumulative sum

输入: [[10,7,5,3,1]]

期望: [10,17,22,25,26]

严格递减输入下没有任何弹出,栈持续增长,输出即输入的累计和。

Case 3 · visible: strictly increasing yields the bid value at each tick

输入: [[1,2,3,4,5]]

期望: [1,2,3,4,5]

严格递增输入下每次入栈都把先前所有元素弹出,栈中只剩当前元素,输出等于 bids[i]。

最近提交

还没有提交记录。

编码区

实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

Case 1 · statement-example: 5-tick mixed sequence

输入: [[4,3,5,2,1]]

期望: [4,7,5,7,8]

i=0 入栈 4,sum=4;i=1 入栈 3(不弹出),sum=7;i=2 入 5 弹出 3 与 4,sum=5;i=3 入栈 2,sum=7;i=4 入栈 1,sum=8。

Case 2 · visible: strictly decreasing yields cumulative sum

输入: [[10,7,5,3,1]]

期望: [10,17,22,25,26]

严格递减输入下没有任何弹出,栈持续增长,输出即输入的累计和。

Case 3 · visible: strictly increasing yields the bid value at each tick

输入: [[1,2,3,4,5]]

期望: [1,2,3,4,5]

严格递增输入下每次入栈都把先前所有元素弹出,栈中只剩当前元素,输出等于 bids[i]。