有一个未排序的列表a和一个范围列表,例如ranges = [(10, 20), (30, 50), (15, 35) ...]。 a中的最大值是uint64_t。目标是计算每个范围的元素数量。正常的解决方案非常直观,只需计算范围内的元素并打印结果即可。但问题是来自在线法官。我厌倦了保密的解决方案,但对于每个解决方案,OJ都给出了超过时限的限制。
a的最大长度为10,000,000,ranges的最大长度为1,000,000。
测试列表a具有1000万个随机数,而ranges具有100万对范围:
import numpy as np
a = list(np.random.randint(low=1, high=0x7fffffffffffffff, size=10_000_000))
ranges = []
for _ in range(1_000_000):
x, y = np.random.randint(low=1, high=0x7fffffffffffffff, size=2)
ranges.append((x, y) if x < y else (y, x))
第一个解决方案是:
import bisect
a.sort()
low_d = {}
up_d = {}
def count(r):
low, up = r
if low not in low_d:
l = bisect.bisect_left(a, low)
low_d[low] = l
else:
l = low_d[low]</