Python 如何更快地计算总和
内存限制:256 MB 时限:1秒 你好 我们有以下代码:Python 如何更快地计算总和,python,optimization,sum,Python,Optimization,Sum,内存限制:256 MB 时限:1秒 你好 我们有以下代码: N, M = list(map(int, input().split())) stones = list(map(int, input().split())) for __ in range(M): command, index, num = input().split() index, num = int(index), int(num) if command == "S": print(s
N, M = list(map(int, input().split()))
stones = list(map(int, input().split()))
for __ in range(M):
command, index, num = input().split()
index, num = int(index), int(num)
if command == "S":
print(sum(stones[index:num + 1]))
elif command == "M":
stones[index] = num
其中:
石头的长度
命令的数量
{type}{index}{index2或value}
的命令有两种类型:
- “S”用于打印范围内项目的总和
[index;index2]
- “M”将
≤ 十,索引上项目的值更改为新的0≤ <代码>值
如果您使用
b
更新列表项,并且以前的值是a
,则新的和是s+b-a
(使用s
旧的和)。因此,您可以定义一个“sumtree”,在二叉树中存储范围内的和。然后每个sum调用都是O(logn),更新也是O(logn)。sum(为[x]范围内的i(索引:num+1)中的i添加[i])
不会为每个片构建额外的列表。另外,您也可以只收集输出并在最后打印一次(使用'\n'.join
)。@schwobaseggg生成器比为sum
创建切片进行内部迭代要慢得多。您正在优化内存使用,而不是运行时。@WillemVanOnsem,我不完全理解如何实现这个二叉树。你能更详细地解释一下这一点吗?如果你用b
更新列表项,而之前的值是a
,那么新的和是s+b-a
(用s
旧的和)。因此,你可以定义一个“sumtree”,在二叉树中存储范围内的和。然后每个sum调用都是O(logn),更新也是O(logn)。sum(为[x]范围内的i(索引:num+1)中的i添加[i])
不会为每个片构建额外的列表。另外,您也可以只收集输出并在最后打印一次(使用'\n'.join
)。@schwobaseggg生成器比为sum
创建切片进行内部迭代要慢得多。您正在优化内存使用,而不是运行时。@WillemVanOnsem,我不完全理解如何实现这个二叉树。你能更详细地解释这一点吗?
9 10
1 1 2 3 5 0 4 9 4
S 2 4
S 8 8
S 0 8
S 4 5
M 5 9
S 0 8
S 4 5
M 0 7
S 1 8
S 0 5
10
4
29
5
38
14
37
27