fork download
  1. import sys
  2.  
  3. def solve():
  4. # 全ての入力を読み込み、空白で分割してリスト化
  5. input_data = sys.stdin.read().split()
  6. if not input_data:
  7. return
  8.  
  9. # ジョブの数 n
  10. n = int(input_data[0])
  11.  
  12. # ジョブ情報をリストに格納
  13. # 各要素: [開始時刻, 終了時刻, 価値]
  14. jobs = []
  15. curr = 1
  16. for _ in range(n):
  17. s = int(input_data[curr])
  18. f = int(input_data[curr + 1])
  19. v = int(input_data[curr + 2])
  20. jobs.append([s, f, v])
  21. curr += 3
  22.  
  23. # 終了時刻(インデックス1)をキーに昇順ソート
  24. # Pythonの sort() は「安定ソート」なので、終了時刻が同じ場合は入力順が維持されます
  25. jobs.sort(key=lambda x: x[1])
  26.  
  27. # ジョブ番号を1から数えるため、リストの最初にダミー要素を追加
  28. # これにより sorted_jobs[1] がソート後の最初のジョブになります
  29. sorted_jobs = [[-1, -1, 0]] + jobs
  30.  
  31. # q(j) の値を計算して格納するリスト
  32. q = [0] * (n + 1)
  33.  
  34. for j in range(1, n + 1):
  35. sj = sorted_jobs[j][0] # ジョブ j の開始時刻
  36.  
  37. # ジョブ j より前のジョブ i (j-1, j-2, ..., 1) を逆順に探索
  38. # 終了時刻 fi <= sj となる最大の i を探す
  39. for i in range(j - 1, 0, -1):
  40. fi = sorted_jobs[i][1] # ジョブ i の終了時刻
  41. if fi <= sj:
  42. q[j] = i
  43. break
  44. else:
  45. # 見つからなかった場合は q[j] = 0 (初期値のまま)
  46. q[j] = 0
  47.  
  48. # 指定された形式で出力
  49. for j in range(1, n + 1):
  50. print(f"q {j} = {q[j]}")
  51.  
  52. if __name__ == "__main__":
  53. solve()
Success #stdin #stdout 0.13s 14120KB
stdin
10
3 9 2
5 6 3
1 10 4
4 5 3
6 13 5
4 8 5
3 19 8
6 16 6
9 11 4
3 8 6
stdout
q 1 = 0
q 2 = 1
q 3 = 0
q 4 = 0
q 5 = 0
q 6 = 0
q 7 = 5
q 8 = 2
q 9 = 2
q 10 = 0