我正在解决一个问题,该问题说明如下: 有一排桶从1到n编号。园丁以特定的方式填充这个桶。他填充两端l和r之间的桶,包括l和r,其中1 <= 1 <= r <= n。他这样做了k次。我们需要找到水桶等于水桶中的体积中位数。我正在使用时间复杂度的程序来解决这个问题。输入如下:第一行包含空格分隔的n和k,下一个k行包含每个浇水过程的对l和r。我正在使用nklgn的算法来解决这个问题,如下所示:
while True:
nk = input().split(' ')
n = int(nk[0])
k = int(nk[1])
a = input().split(' ')
for z in range(len(a)):
a[z] = int(a[z])
if n==0 and k==0: break
for mn in range(k):
(x, y) = input().split(' ')
x = int(x)-1
y = int(y)-1
for z in range(x, y+1):
a[z] += 1
print(sorted(a)[int(len(a)/2)])
请帮助我使用更好的算法解决这个问题,我遇到了一个非常类似的问题至少3到4次。如果不是整个代码,你可以在答案中给我一些提示。
答案 0 :(得分:1)
我认为你应该使用Segment Tree。此数据结构用于在O(log(n))时间内更新和检索特定查询。
您可以通过以下方式更新树:首先找到覆盖范围[l,r]的节点,然后将更新的值存储在这些节点中。处理所有这样的查询 - 仅在顶级节点中存储更新的值而不更改原始节点。在此之后,在预订遍历中,您可以在O(n)时间内更新所有必需的节点。我认为这将是一个非常合理的优化。
如果你不了解这个数据结构,那么我建议你先阅读一下,然后尝试理解我的答案。
答案 1 :(得分:0)
首先,在最后一行中,当您只需要一个元素时,无需对列表进行完整的排序。