結果
問題 |
No.2520 L1 Explosion
|
ユーザー |
|
提出日時 | 2025-02-08 04:24:02 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,267 ms / 2,000 ms |
コード長 | 2,453 bytes |
コンパイル時間 | 318 ms |
コンパイル使用メモリ | 82,360 KB |
実行使用メモリ | 237,340 KB |
最終ジャッジ日時 | 2025-02-08 04:24:18 |
合計ジャッジ時間 | 16,256 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 22 |
ソースコード
## https://yukicoder.me/problems/no/2520 MOD = 998244353 def to_uv(x, y): return x + y, x - y def main(): N, M = map(int, input().split()) xyh = [] for _ in range(N): x, y, h = map(int, input().split()) xyh.append((x, y, h)) uv = [] for x, y, h in xyh: u1, v1 = to_uv(x + M - h, y) u2, v2 = to_uv(x, y + M - h) u3, v3 = to_uv(x - (M - h), y) u4, v4 = to_uv(x, y - (M - h)) min_u = min(u1, u2, u3, u4) max_u = max(u1, u2, u3, u4) min_v = min(v1, v2, v3, v4) max_v = max(v1, v2, v3, v4) uv.append((min_u, min_v, max_u, max_v)) # uの世界での座標圧縮 u_set = set() v_set = set() for min_u, min_v, max_u, max_v in uv: u_set.add(min_u) u_set.add(max_u) u_set.add(max_u + 1) v_set.add(min_v) v_set.add(max_v) v_set.add(max_v + 1) u_list = list(u_set) u_list.sort() u_map = {} for i, u in enumerate(u_list): u_map[u] = i u_max = len(u_list) v_list = list(v_set) v_list.sort() v_map = {} for i, v in enumerate(v_list): v_map[v] = i v_max = len(v_list) cells = [[0] * v_max for _ in range(u_max)] for min_u, min_v, max_u, max_v in uv: u1 = u_map[min_u] v1 = v_map[min_v] u2 = u_map[max_u] v2 = v_map[max_v] cells[u1][v1] += 1 cells[u2][v2] += 1 cells[u1][v2] -= 1 cells[u2][v1] -= 1 for u in range(u_max): c = 0 for v in range(v_max): c += cells[u][v] cells[u][v] = c for v in range(v_max): c = 0 for u in range(u_max): c += cells[u][v] cells[u][v] = c # 面積計算 answers = [0] * N inv_2 = pow(2, MOD - 2, MOD) for u in range(u_max - 1): for v in range(v_max - 1): x = cells[u][v] if x > 0: u1 = u_list[u] u2 = u_list[u + 1] v1 = v_list[v] v2 = v_list[v + 1] dv = (v2 - v1) % MOD du = (u2 - u1 ) % MOD ans = (dv * du) % MOD ans *= inv_2 ans %= MOD answers[x - 1] += ans answers[x - 1] %= MOD for i in range(N): print(answers[i]) if __name__ == "__main__": main()