kiri___
@kiri___

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

空リストの掛ける数の意味が分からないので教えてほしい。

解決したいこと

入力例
8
5        
2 3      
3 6
5 7
3 7
1 5

入力形式
D
N
L(1) R(1)
:
:
:
L(N) R(N)

今現在書籍で競プロについて学習しております。
その中での問題について質問です。
ある会社ではD日間にわたってイベントが開催され、N人が出席します。参加者i(i = 1,2,...,N)、L(i)日目からR(i)日目まで出席する予定です。各日の出席者数を出力するプログラムを作成してください。という問題です。なぜ、
B = [ 0 ] * (D+2)、Answer = [ None ] * (D+2)
のところでD + 2をかけているのかが分からないので教えて頂きたいです。

発生している問題・エラー

エラーメッセージはありません。

該当するソースコード

D = int(input())
N = int(input())
L = [ None ] * N
R = [ None ] * N
for i in range(N):
	L[i], R[i] = map(int, input().split())

# 前日比に加算
B = [ 0 ] * (D+2)
for i in range(N):
	B[L[i]] += 1
	B[R[i]+1] -= 1

# 累積和をとる
Answer = [ None ] * (D+2)
Answer[0] = 0
for d in range(1, D+1):
	Answer[d] = Answer[d - 1] + B[d]

# 出力
for d in range(1, D+1):
	print(Answer[d])

自分で試したこと

D + 1でもいけるか試して見ましたが、通るテストコードと通らなかったテストコードがありました。

0

日数が1から始まるので、配列としてはD+1個必要。
この場合、添え字は0~Dの配列になる。

一方、
R[i] = Dになる可能性がある。
たとえば、8日間イベントを開催して、2日目から8日目(最終日)まで参加する人。

その場合、B[R[i]+1] -= 1
はB[D+1]のデータを触っていることになるため、エラーになる。

このエラーを回避するために、
B = [ 0 ] * (D+2)
としているのではないでしょうか。

(AnswerにかけるのはD+1でも良いような気はします)

2Like

ご丁寧にありがとうございます。勉強になります。
一つ追加で質問なのですが、

>B[D+1]のデータを触っていることになるため、エラーになる。
ここの部分が私の理解不足で分からないので教えて頂きたいです。
配列として、B = [ 0 ] * (D+1)でB[D+1]までは存在しているのではないかと考えたのですが、確かにエラーメッセージが出ました。

0Like

B = [ 0 ] * (D+1)
は、要素がD+1個の配列を作るので、添え字は0~Dの範囲になります。

ためしに、
B = [0] * 5
print(B)
を実行してみてください。

結果は、下記のようになりますね。
[0, 0, 0, 0, 0]
利用可能な添え字は、左から
0, 1, 2, 3, 4
までです。5(=D+1)にアクセスしようとしたらエラーが出ます。

1Like

B = [ 0 ] * (D+2)、Answer = [ None ] * (D+2)
のところでD + 2をかけているのかが分からない

参考サンプルが日付に引きずれ、自然数の添字を用いた結果ではないでしょうか?

作者の好みなのでそれでも良いのですが、pythonは0から起算するライブラリーが多い言語です。

for d in range(0, D):
	print(d + 1, Answer[d])

競技として早いかは別ですが
利用するときに+1するようにすると、ロジックが見やすくなると思います。

1Like

Your answer might help someone💌