问题:
您将获得一个大小为N的列表,用零初始化。您必须在列表上执行M操作并输出列表中所有元素的最大值。对于每个操作,您将获得三个整数a,b和k,并且您必须为从索引a到b(包括两者)的所有元素添加值。
输入格式
第一行将包含由单个空格分隔的两个整数N和M. 下一行将包含由单个空格分隔的三个整数a,b和k。 列表中的数字从1到N编号。
这是我写的代码:
n,m=map(int,input().split())
arr=[]
for i in range(n+1):
arr.append(0)
for j in range(m):
a,b,k=map(int,input().split())
for i in range(a,b+1):
arr[i]+=k;
print(max(arr))
当我尝试提交我的解决方案时,我会收到“TORINATED DUE TO TIMOUT”消息。请您建议一个避免这类错误的策略,并解决问题。
提前致谢!
答案 0 :(得分:0)
不要遍历列表范围;相反,再次使用map
来增加指示的值。像
for j in range(m):
a,b,k=map(int,input().split())
arr[a:b+1] = map(lambda <increment-by-k>, arr[a:b+1])
这应该让您的居民优化进入并节省一些时间。
答案 1 :(得分:0)
您可能需要一种比O(M * N)具有更高复杂度的算法。
您可以将区间分隔符放在列表中:
n,m=map(int,input().split())
intervals = []
arr = [0 for i in range(n)]
for j in range(m):
a,b,k=map(int,input().split())
intervals += [(str(a), "begin", k)]
intervals += [(str(b), "end", k)]
intervals = sorted(intervals, key=lambda x: x[0]+x[1])
k, i = 0, 0
for op in intervals:
ind = int(op[0])
if op[1] == "begin":
while ind > i:
arr[i] += k
i += 1
k += op[2]
else:
while i <= ind:
arr[i] += k
i+= 1
k -= op[2]
print(arr)
如果排序算法为O(MlogM),则为O(MlogM + N)