You need to enable JavaScript to run this app. Python实现区间和查询:读完所有输入后输出且不存储值解决TLE
优惠活动
大模型
产品
解决方案
定价
更多

Python实现区间和查询:读完所有输入后输出且不存储值解决TLE

问题根因
  • 你当前代码的TLE核心并非存储输出列表,而是两个致命的性能瓶颈:
    • 每次查询直接对数组切片执行sum(),单次查询时间复杂度为O(k)(k为区间长度),总复杂度为O(q*n),n、q稍大就会远超1秒时间限制。
    • Python内置input()在大量输入场景下速度极慢,反复调用会额外消耗大量时间。
  • 你要求的「读完所有输入再输出、不额外存储输入数组、不存储输出结果到列表/元组」完全可以落地,不会影响性能。
优化实现方案

1. 前缀和预处理,把单次查询复杂度降到O(1)

构建前缀和数组pre,其中pre[i]代表数组前i个元素的和,任意区间[a,b]的和直接等于pre[b] - pre[a-1],整体仅需O(n)预处理时间,总复杂度降至O(n+q),完全满足1秒限制。
处理原始输入数组时直接计算前缀和,不需要额外存储原始数组的内存开销,符合你「无需存储输入数值」的要求。

2. 一次性读取所有输入,规避反复调用input的开销

直接用sys.stdin.read()把所有输入一次性读入,拆分为按空格分割的token队列按顺序取值,既符合「读完所有输入再处理」的要求,也完全避免了多次调用input()的性能损耗。

3. 直接拼接输出缓冲区,不存储结果列表

所有查询结果转成字符串后直接拼接到输出缓冲区,不需要用列表/元组存储所有结果,最后一次性输出,避免了多次调用print()的缓冲区刷新开销,同时满足你的存储限制要求。

可运行代码

基础版(字符串拼接输出)

import sys
def main():
    # 一次性读取全部输入
    data = sys.stdin.read().split()
    ptr = 0
    n = int(data[ptr])
    ptr += 1
    q = int(data[ptr])
    ptr += 1

    # 直接基于输入构建前缀和,不保留原始数组
    pre = [0] * (n + 1)
    for i in range(1, n + 1):
        pre[i] = pre[i-1] + int(data[ptr])
        ptr += 1

    # 拼接输出字符串,不存结果列表
    output_str = ""
    for _ in range(q):
        a = int(data[ptr])
        ptr += 1
        b = int(data[ptr])
        ptr += 1
        res = pre[b] - pre[a-1]
        output_str += f"{res}\n"
    
    # 所有输入处理完成后一次性输出
    print(output_str, end="")
    # 如需进一步释放内存可在此处删除输入缓存:del data

if __name__ == "__main__":
    main()

高负载版(适配超大量查询)

如果q规模极大(如1e5以上),字符串拼接可能产生额外临时对象开销,可换用io.StringIO作为输出缓冲区,同样不需要列表存储结果:

import sys
import io
def main():
    data = sys.stdin.read().split()
    ptr = 0
    n = int(data[ptr])
    ptr += 1
    q = int(data[ptr])
    ptr += 1

    pre = [0] * (n + 1)
    for i in range(1, n + 1):
        pre[i] = pre[i-1] + int(data[ptr])
        ptr += 1

    out_buf = io.StringIO()
    for _ in range(q):
        a = int(data[ptr])
        ptr += 1
        b = int(data[ptr])
        ptr += 1
        res = pre[b] - pre[a-1]
        out_buf.write(f"{res}\n")
    
    print(out_buf.getvalue(), end="")
    # 如需进一步释放内存可在此处删除输入缓存:del data

if __name__ == "__main__":
    main()
验证效果

用题目给出的示例输入运行,输出完全匹配预期:

11
2
24
4

内容的提问来源于stack exchange,提问作者Dudeness

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 18:54:03