結果
問題 |
No.255 Splarrraaay スプラーレェーーイ
|
ユーザー |
![]() |
提出日時 | 2025-04-16 15:59:41 |
言語 | PyPy3 (7.3.15) |
結果 |
MLE
|
実行時間 | - |
コード長 | 3,335 bytes |
コンパイル時間 | 295 ms |
コンパイル使用メモリ | 82,328 KB |
実行使用メモリ | 414,240 KB |
最終ジャッジ日時 | 2025-04-16 16:03:38 |
合計ジャッジ時間 | 15,290 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 2 TLE * 1 MLE * 1 -- * 6 |
ソースコード
MOD = 10**18 + 9 def main(): import sys input = sys.stdin.read().split() ptr = 0 N = int(input[ptr]) ptr += 1 Q = int(input[ptr]) ptr += 1 intervals = [(0, N-1, -1, 0)] # (start, end, team, thickness) sum_team = [0] * 5 # A-E are 0-4 bonus = [0] * 5 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: current_sum = [0] * 5 for (s, e, t, thk) in intervals: if e < l or s > r: continue os = max(s, l) oe = min(e, r) length = oe - os + 1 if t != -1: current_sum[t] += thk * length max_val = max(current_sum) count = current_sum.count(max_val) if count == 1: for i in range(5): if current_sum[i] == max_val: bonus[i] = (bonus[i] + max_val) % MOD break else: team = x - 1 # 0-based new_intervals = [] overlap_intervals = [] non_overlap = [] for interval in intervals: s, e, t, thk = interval if e < l or s > r: non_overlap.append(interval) else: overlap_intervals.append(interval) new_intervals = non_overlap.copy() for interval in overlap_intervals: s, e, t, thk = interval left = None if s < l: left = (s, l-1, t, thk) right = None if e > r: right = (r+1, e, t, thk) os = max(s, l) oe = min(e, r) if os > oe: if left: new_intervals.append(left) if right: new_intervals.append(right) continue if t != -1: sum_team[t] = (sum_team[t] - thk * (oe - os + 1)) % MOD new_t = team new_thk = thk + 1 if t == team else 1 sum_team[new_t] = (sum_team[new_t] + new_thk * (oe - os + 1)) % MOD if left: new_intervals.append(left) if right: new_intervals.append(right) new_intervals.append((os, oe, new_t, new_thk)) intervals = [] if new_intervals: new_intervals.sort(key=lambda x: x[0]) intervals.append(new_intervals[0]) for i in range(1, len(new_intervals)): last = intervals[-1] curr = new_intervals[i] if last[1] + 1 >= curr[0] and last[2] == curr[2] and last[3] == curr[3]: merged = (last[0], curr[1], last[2], last[3]) intervals[-1] = merged else: intervals.append(curr) total = [ (sum_team[i] + bonus[i]) % MOD for i in range(5) ] print(' '.join(map(str, total))) if __name__ == '__main__': main()