我正在解决 Yandex 前几年的问题,但仍然无法通过大量数据的测试,随着时间的推移它会下降。任务本身

我的代码:
n = int(input())
orders = []
for i in range(n):
start = list(map(int, input().split()))
orders.append(start)
q = int(input())
queries = []
for i in range(q):
start = list(map(int, input().split()))
queries.append(start)
results = []
for query in queries:
query_type = query[-1]
if query_type == 1:
start_time = query[0]
end_time = query[1]
total_cost = 0
for order in orders:
order_start_time = order[0]
if order_start_time >= start_time and order_start_time <= end_time:
total_cost += order[2]
results.append(total_cost)
elif query_type == 2:
start_time = query[0]
end_time = query[1]
total_duration = 0
for order in orders:
order_end_time = order[1]
if order_end_time >= start_time and order_end_time <= end_time:
total_duration += order[1] - order[0]
results.append(total_duration)
print(*results)
输入和输出数据示例
进入
1
10 100 1000
6
1 10 1
1 10 2
10 100 1
10 100 2
100 1000 1
100 1000 2
结论
1000 0 1000 90 0 90
进入
5
5 20 5
6 21 4
6 22 3
7 23 2
10 24 1
3
6 11 1
4 6 1
7 11 1
结论
10 12 3
扫地。活动按时间和活动类型组织。
对类型进行排序,以便请求周期是一个闭区间。
状态:累计值
totals[0]和累计时长totals[1]。解决方案的复杂度为 O((n + q)log(n + q))。大部分时间都花在排序上。扫描本身是线性的。空间复杂度O(n + q)。
将循环替换为列表推导式以创建订单和查询列表,因为这更高效且更具可读性。还将计算总计的条件合并到一个循环中,以避免代码重复并加快程序执行速度。
由于查询涉及的是间隔的总和,因此我们将按时间对初始值进行排序并保存累积总和。要计算区间上的总和,您需要找到区间的左端和右端,并减去两端的累积和。
该算法的复杂度为 O((n + q)logn)。nlogn - 顺序排序,qlogn - 查询执行。空间复杂度O(n)。