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
相关产品推荐
相关产品推荐

