結果
問題 |
No.255 Splarrraaay スプラーレェーーイ
|
ユーザー |
![]() |
提出日時 | 2025-06-12 18:09:14 |
言語 | PyPy3 (7.3.15) |
結果 |
MLE
|
実行時間 | - |
コード長 | 4,674 bytes |
コンパイル時間 | 335 ms |
コンパイル使用メモリ | 82,512 KB |
実行使用メモリ | 289,244 KB |
最終ジャッジ日時 | 2025-06-12 18:11:35 |
合計ジャッジ時間 | 14,805 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
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()