B - 会議室の空き時間 / Available Time Slots for Meeting Rooms 解説 by admin
Qwen3-Coder-480B概要
与えられた会議室の予約情報から、最も長い連続した空き時間を求めます。
考察
この問題では、会議室の利用時間帯(予約)が複数与えられ、それらの「間」や「前後」に存在する空き時間のうち、最も長いものを求めることになります。
重要な観察点は以下の通りです: - 各予約は重ならないことが保証されているため、単純に開始時刻順にソートすることで、順番に処理できます。 - 空き時間は以下の3パターンに分かれます: 1. 最初の予約が始まる前の時間(時刻 \(0\) 〜 最初の \(S_i\)) 2. ある予約の終了時刻と、次の予約の開始時刻の間(\(E_i\) 〜 \(S_{i+1}\)) 3. 最後の予約が終わった後の時間(最後の \(E_i\) 〜 時刻 \(T\))
これらの空き時間を順に調べて最大値を取れば答えが得られます。
素朴な方法として、すべての時間(0〜T)をシミュレーションすることは不可能です。なぜなら、\(T\) が最大 \(10^9\) まであり、1秒ずつ調べるとTLE(時間超過)になるからです。
この問題では、予約の数 \(N\) が最大 \(2 \times 10^5\) なので、予約をソートしてその間を調べる方法が現実的です。
アルゴリズム
- 入力を読み込み、予約を開始時刻 \(S_i\) の順にソートします。
- 最初の予約以前の空き時間を計算:
$\(\text{max\_gap} = \max(\text{max\_gap}, S_1 - 0)\)$ - 各隣接する予約の間の空き時間を計算:
$\(\text{gap} = S_{i+1} - E_i\)\( \)\(\text{max\_gap} = \max(\text{max\_gap}, \text{gap})\)$ - 最後の予約以降の空き時間を計算:
$\(\text{gap} = T - E_N\)\( \)\(\text{max\_gap} = \max(\text{max\_gap}, \text{gap})\)$ - 最大の \(\text{max\_gap}\) を出力します。
具体例
入力:
3 20
5 9
12 15
0 3
予約を開始時刻順にソートすると:
(0, 3), (5, 9), (12, 15)
空き時間は: - 時刻 0〜3 の前:なし(開始時刻が0) - 3〜5 の間:長さ 2 - 9〜12 の間:長さ 3 - 15〜20 の間:長さ 5
よって、最も長い空き時間は 5 です。
計算量
- 時間計算量: \(O(N \log N)\) (ソートが支配的)
- 空間計算量: \(O(N)\) (予約情報を保存)
実装のポイント
入力が多いので
sys.stdin.readを使って高速化している予約がない場合(\(N=0\))は、会議室は丸一日空きなので、\(T\) をそのまま出力する
ソート後に最初・最後・間の3種類の空き時間を漏れなくチェックする
ソースコード
import sys
input = sys.stdin.read
def main():
data = input().split()
N = int(data[0])
T = int(data[1])
intervals = []
index = 2
for _ in range(N):
s = int(data[index])
e = int(data[index+1])
intervals.append((s, e))
index += 2
# 開始時刻でソート
intervals.sort()
max_gap = 0
# 最初の予約より前の空き時間
if intervals:
max_gap = max(max_gap, intervals[0][0])
else:
max_gap = T
# 予約と予約の間の空き時間
for i in range(1, N):
prev_end = intervals[i-1][1]
curr_start = intervals[i][0]
gap = curr_start - prev_end
if gap > max_gap:
max_gap = gap
# 最後の予約より後の空き時間
if intervals:
last_end = intervals[-1][1]
gap = T - last_end
if gap > max_gap:
max_gap = gap
print(max_gap)
if __name__ == "__main__":
main()
この解説は qwen3-coder-480b によって生成されました。
投稿日時:
最終更新: