結果

問題 No.674 n連勤
ユーザー lam6er
提出日時 2025-03-20 20:38:19
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 1,107 ms / 2,000 ms
コード長 1,663 bytes
コンパイル時間 364 ms
コンパイル使用メモリ 82,108 KB
実行使用メモリ 106,476 KB
最終ジャッジ日時 2025-03-20 20:38:47
合計ジャッジ時間 5,049 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 17
権限があれば一括ダウンロードができます

ソースコード

diff #

import bisect

def main():
    import sys
    input = sys.stdin.read
    data = input().split()
    idx = 0
    D = int(data[idx])
    idx += 1
    Q = int(data[idx])
    idx += 1
    queries = []
    for _ in range(Q):
        A = int(data[idx])
        B = int(data[idx+1])
        queries.append((A, B))
        idx += 2
    
    intervals = []
    max_len = 0
    for A, B in queries:
        if not intervals:
            new_start, new_end = A, B
            current_length = new_end - new_start + 1
            if current_length > max_len:
                max_len = current_length
            bisect.insort(intervals, (new_start, new_end))
            print(max_len)
            continue
        
        starts = [interval[0] for interval in intervals]
        i = bisect.bisect_left(starts, A)
        
        new_start = A
        new_end = B
        
        left = i - 1
        while left >= 0 and intervals[left][1] >= new_start - 1:
            new_start = min(intervals[left][0], new_start)
            new_end = max(intervals[left][1], new_end)
            left -= 1
        
        right = i
        while right < len(intervals) and intervals[right][0] <= new_end + 1:
            new_end = max(new_end, intervals[right][1])
            right += 1
        
        del_start = left + 1
        del_end = right
        if del_start < del_end:
            del intervals[del_start:del_end]
        bisect.insort(intervals, (new_start, new_end))
        
        current_length = new_end - new_start + 1
        if current_length > max_len:
            max_len = current_length
        print(max_len)
        
if __name__ == "__main__":
    main()
0