結果
問題 | No.2696 Sign Creation |
ユーザー |
|
提出日時 | 2024-11-02 20:29:39 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,518 ms / 2,500 ms |
コード長 | 3,265 bytes |
コンパイル時間 | 499 ms |
コンパイル使用メモリ | 82,360 KB |
実行使用メモリ | 107,868 KB |
最終ジャッジ日時 | 2024-11-02 20:29:57 |
合計ジャッジ時間 | 16,874 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 38 |
ソースコード
## https://yukicoder.me/problems/no/2696 from collections import deque def main(): H, W, N, D = map(int, input().split()) xy = [] for _ in range(N): x, y = map(int, input().split()) xy.append((x - 1, y -1)) # 座標から星idを取れるようにする star_map = {} for i in range(N): x, y = xy[i] star_map[(x, y)] = i # 連結成分ごとに分ける components_list = [-1] * N component_id = 0 for s in range(N): if components_list[s] == -1: queue = deque() queue.append(s) components_list[s] = component_id while len(queue) > 0: v = queue.popleft() h, w = xy[v] for di in range(-5, 6): for dj in range(-5, 6): if abs(di) + abs(dj) > D: continue if di == 0 and dj == 0: continue new_h = h + di new_w = w + dj if 0 <= new_h < H and 0 <= new_w < W: if (new_h, new_w) in star_map: new_v = star_map[(new_h, new_w)] if components_list[new_v] == -1: components_list[new_v] = component_id queue.append(new_v) component_id += 1 # 星の集合の中にどれくらい星があるかを入れる component_id_map = {} for i in range(N): c_id = components_list[i] if c_id not in component_id_map: component_id_map[c_id] = 0 component_id_map[c_id] += 1 base_size = 0 for key, volume in component_id_map.items(): if volume > 1: base_size += 1 min_size = base_size max_size = base_size # それぞれの座標に星を置いた時の調査 for h in range(H): for w in range(W): if (h, w) in star_map: continue seiza_set = set() b = set() for di in range(-5, 6): for dj in range(-5, 6): if abs(di) + abs(dj) > D: continue if di == 0 and dj == 0: continue new_h = h + di new_w = w + dj if 0 <= new_h < H and 0 <= new_w < W: if (new_h, new_w) in star_map: i = star_map[(new_h, new_w)] x = components_list[i] if component_id_map[x] == 1: b.add(x) else: seiza_set.add(x) ans = 0 if len(seiza_set) > 0: ans = 1 - len(seiza_set) elif len(b) > 0: ans = 1 min_size = min(min_size, base_size + ans) max_size = max(max_size, base_size + ans) print(min_size, max_size) if __name__ == "__main__": main()