仍未被击穿的买价栈累加和:当下尚未被覆盖的支撑层合计
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]=7 到 output[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 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
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]。