考え方
差分だけを処理していく問題.ログインとログアウトを後で区別できるようにして「ごちゃまぜソート」をするとラク(これもよくあるパターン).日付を1日単位で見るとTLE.「現れる日付の差」を使って処理する.
現れる日付を前から見ていき,今ログインしている人数cnt
を管理する.ログイン人数がcnt
のときの答えをans[cnt]
とする.
- (前日-最終変化日+1)=(当日-最終変化日)を
ans[cnt]
に加える. - ログインなら
cnt
に1を加え,ログアウトなら1を引く. - 最終変化日
last
更新する.
回答例
N = int(input()) L = [] for _ in range(N): A, B = map(int, input().split()) L.append((A, 1)) L.append((A + B, -1)) L.sort() last = 0 cnt = 0 ans = [0] * (N + 1) for X in L: ans[cnt] += X[0] - last cnt += X[1] last = X[0] print(*ans[1:])