結果
| 問題 | No.255 Splarrraaay スプラーレェーーイ | 
| コンテスト | |
| ユーザー |  gew1fw | 
| 提出日時 | 2025-06-12 12:53:59 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                MLE
                                 
                             | 
| 実行時間 | - | 
| コード長 | 4,674 bytes | 
| コンパイル時間 | 448 ms | 
| コンパイル使用メモリ | 82,292 KB | 
| 実行使用メモリ | 286,804 KB | 
| 最終ジャッジ日時 | 2025-06-12 12:57:37 | 
| 合計ジャッジ時間 | 15,313 ms | 
| ジャッジサーバーID (参考情報) | judge4 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 3 MLE * 1 -- * 6 | 
ソースコード
import sys
MOD = 10**18 + 9
def main():
    input = sys.stdin.read().split()
    ptr = 0
    N = int(input[ptr])
    ptr += 1
    Q = int(input[ptr])
    ptr += 1
    teams = {1: [], 2: [], 3: [], 4: [], 5: []}
    bonus = {1: 0, 2: 0, 3: 0, 4: 0, 5: 0}
    for _ in range(Q):
        x = int(input[ptr])
        ptr += 1
        l = int(input[ptr])
        ptr += 1
        r = int(input[ptr])
        ptr += 1
        if x == 0:
            sum_counts = {1: 0, 2: 0, 3: 0, 4: 0, 5: 0}
            for team in teams:
                for interval in teams[team]:
                    s, e, cnt = interval
                    overlap_s = max(s, l)
                    overlap_e = min(e, r)
                    if overlap_s > overlap_e:
                        continue
                    sum_counts[team] += (overlap_e - overlap_s + 1) * cnt
            max_sum = max(sum_counts.values())
            candidates = [k for k, v in sum_counts.items() if v == max_sum]
            if len(candidates) == 1:
                bonus[candidates[0]] += max_sum
        else:
            X = x
            L = l
            R = r
            for Y in teams:
                if Y == X:
                    continue
                new_intervals = []
                for interval in teams[Y]:
                    s, e, cnt = interval
                    if e < L or s > R:
                        new_intervals.append((s, e, cnt))
                        continue
                    if s <= L - 1:
                        new_intervals.append((s, L - 1, cnt))
                    if R + 1 <= e:
                        new_intervals.append((R + 1, e, cnt))
                teams[Y] = new_intervals
            new_X_intervals = []
            to_increment = []
            for interval in teams[X]:
                s, e, cnt = interval
                if e < L or s > R:
                    new_X_intervals.append((s, e, cnt))
                    continue
                if s <= L - 1:
                    new_X_intervals.append((s, L - 1, cnt))
                part_s = max(s, L)
                part_e = min(e, R)
                if part_s <= part_e:
                    to_increment.append((part_s, part_e, cnt + 1))
                if R + 1 <= e:
                    new_X_intervals.append((R + 1, e, cnt))
            merged_to_increment = []
            for s, e, cnt in sorted(to_increment, key=lambda x: x[0]):
                if not merged_to_increment:
                    merged_to_increment.append((s, e, cnt))
                else:
                    last_s, last_e, last_cnt = merged_to_increment[-1]
                    if last_e >= s - 1 and last_cnt == cnt:
                        merged_to_increment[-1] = (last_s, max(last_e, e), cnt)
                    else:
                        merged_to_increment.append((s, e, cnt))
            current = L
            uncovered = []
            for s, e, cnt in merged_to_increment:
                if s > current:
                    uncovered.append((current, s - 1))
                current = max(current, e + 1)
            if current <= R:
                uncovered.append((current, R))
            new_uncovered = [(s, e, 1) for s, e in uncovered]
            merged = merged_to_increment + new_uncovered
            merged.sort(key=lambda x: x[0])
            final_merged = []
            for s, e, cnt in merged:
                if not final_merged:
                    final_merged.append((s, e, cnt))
                else:
                    last_s, last_e, last_cnt = final_merged[-1]
                    if last_e == s - 1 and last_cnt == cnt:
                        final_merged[-1] = (last_s, e, cnt)
                    else:
                        final_merged.append((s, e, cnt))
            combined = new_X_intervals + final_merged
            combined.sort(key=lambda x: x[0])
            merged_combined = []
            for s, e, cnt in combined:
                if not merged_combined:
                    merged_combined.append((s, e, cnt))
                else:
                    last_s, last_e, last_cnt = merged_combined[-1]
                    if last_e == s - 1 and last_cnt == cnt:
                        merged_combined[-1] = (last_s, e, cnt)
                    else:
                        merged_combined.append((s, e, cnt))
            teams[X] = merged_combined
    scores = [0] * 5
    for team in teams:
        total = 0
        for interval in teams[team]:
            s, e, cnt = interval
            total += (e - s + 1) * cnt
        scores[team - 1] = (total + bonus[team]) % MOD
    print(' '.join(map(str, scores)))
if __name__ == '__main__':
    main()
            
            
            
        