1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Atcoder Beginner Contest 221 D - Online games

Posted at

#問題

ABC221 D - Online games

#解答

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になりました)

#解法

  • ログインした日とログアウトした日を早い順に並べて日付ごとのログイン人数を増減させる。
  • ログイン人数に応じた日数を記録する配列を持っておき、ログインした人かログアウトした人がいた場合、それまでのログイン人数と日数を配列に加算していく。

#おわりに
このような問題は以前解いたことがあり、しっかり理解したつもりだったのですが、実際の問題に活用ませんでした。
ただでさえまだ全然知識がない状態なので知識のある問題は確実に取れるようにしないと行けないですね。。。
あと、この記事を書くにあたってこの解法がどういう名前なのかをを調べたのですがいまいちわからなかったので知ってる方がいたら教えていただきたいです。

以上、最後まで読んでいただきありがとうございました。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?