首先来看题目
结合样式一和样式二,我们能够得到一个简单的思路:先从小找大找依赖,更新他们的最早开始时间,然后通过和它们需要训练的时间相加,得到依赖这些的项的最早开始时间
在样式三和子任务中我们能看到最早时间可能就会超出比赛前的时间阈值,而且n和m是有范围的
代码如下:
n, m = map(int, input().split())
depend = [0] + [i for i in map(int, input().split())]
need = [0] + [i for i in map(int, input().split())]
earliest = [0] * (m+1)
latest = [0] * (m+1)
flag = 1
# flag用来判断是否能完成训练
for i in range(1, m + 1):
# 依赖为0的项目比较特殊,我们可以直接讨论
if depend[i] == 0:
earliest[i] = 1
else:
earliest[i] = earliest[depend[i]] + need[depend[i]]
# earliest[p[i]]是依赖的那项所对应的最早时间
if earliest[i] + need[i] > n:
flag = 0
#注意发现第一个超出阈值的项目时就可以判断能否完成训练了,在循环过后再判断比较麻烦
print(*earliest[1:])
if flag == 1:
# 我们看样例一的时候就能发现他是将最后一个训练置为1,从后往前推得到的最晚时间
for i in range(m, 0, -1):
temp = 366
# 0 < n <= 365
for j in range(i + 1, m + 1):
if depend[j] == i:
temp = min(temp, latest[j])
if temp == 366:
latest[i] = n - need[i] + 1
else:
latest[i] = temp - need[i]
print(*latest[1:])
#变量前加*可以把列表中的元素逐个打印出来:*[1,2,3] = 1 2 3