atcoder ABC320 E - Somen Nagashi のSortedListを使った実装
・参考
トヨタ自動車プログラミングコンテスト2023#5(AtCoder Beginner Contest 320) - YouTube
Sorted List — Sorted Containers 2.4.0 documentation
・説明
SortedListを使うことで先頭の要素(昇順になっているので最小値)をpop(0)を使い、O(log (N))で取得できる。普通のリストではpopに引数を付けるとO(N)になり、TLEになる。他にもheapqやdequeを使うことで解くことができるがSortedListが楽だと思う。
プログラムの説明は今、列にいる人をorder、列から外れた人をt_whoで管理して、T以下の時間のものをorderに戻す。詳しい説明はコメントアウトしている。
from sortedcontainers import SortedList n,m=map(int,input().split()) ans=[0 for _ in range(n)] order=SortedList([i for i in range(n)]) #列にいる人の順番. t_who=SortedList() #(時間,何番目の人)を追加していく、何番目の人がどの時間に列に戻るか表す。 for _ in range(m): t,w,s=map(int,input().split()) while len(t_who)!=0: tt,who=t_who.pop(0) #t_whoからt以下の時間の人を列orderに戻す. if tt<=t: order.add(who) #そうでなかったら、popしたものをもとに戻してbreak. else: t_who.add((tt,who)) break if len(order)==0: continue p=order.pop(0) #そうめんを食べる人. ans[p]+=w t_who.add((t+s,p)) for i in range(n): print(ans[i])