#問題
#解答
N = int(input())
AB = [""]*2*N
dayList = [""]*2*N
for i in range(N):
A,B = map(int,input().split())
AB[2*i] = [A,1]
AB[2*i+1]= [A+B,-1]
dayList[2*i] = A
dayList[2*i+1] = A+B
daySet = sorted(set(dayList))
AB.sort()
loginNum = 0
index = 0
loginDays = [0]*(N+1)
for i in range(len(daySet)):
logiNumBefore = loginNum
while AB[index][0] == daySet[i]:
loginNum += AB[index][1]
index +=1
if index >= len(AB):
break
if i ==0:
continue
else:
loginDays[logiNumBefore] += (daySet[i] - daySet[i-1])
loginDays.pop(0)
print(" ".join(map(str,loginDays)))
※記事を書くにあたって提出してACになったソースコードを綺麗に書き直し、Python3で提出したら何故かTLEになってしまいました。(PyPyではACになりました)
#解法
- ログインした日とログアウトした日を早い順に並べて日付ごとのログイン人数を増減させる。
- ログイン人数に応じた日数を記録する配列を持っておき、ログインした人かログアウトした人がいた場合、それまでのログイン人数と日数を配列に加算していく。
#おわりに
このような問題は以前解いたことがあり、しっかり理解したつもりだったのですが、実際の問題に活用ませんでした。
ただでさえまだ全然知識がない状態なので知識のある問題は確実に取れるようにしないと行けないですね。。。
あと、この記事を書くにあたってこの解法がどういう名前なのかをを調べたのですがいまいちわからなかったので知ってる方がいたら教えていただきたいです。
以上、最後まで読んでいただきありがとうございました。