結果
問題 |
No.2094 Symmetry
|
ユーザー |
![]() |
提出日時 | 2025-03-20 18:57:50 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 217 ms / 2,000 ms |
コード長 | 2,711 bytes |
コンパイル時間 | 268 ms |
コンパイル使用メモリ | 82,400 KB |
実行使用メモリ | 123,240 KB |
最終ジャッジ日時 | 2025-03-20 18:58:55 |
合計ジャッジ時間 | 7,167 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 34 |
ソースコード
import sys def main(): N, K = map(int, sys.stdin.readline().split()) grid = [] for _ in range(2*N): grid.append(sys.stdin.readline().strip()) C = [] for _ in range(2*N): row = list(map(int, sys.stdin.readline().split())) C.append(row) # Compute initial k and initial_sum initial_k = 0 initial_sum = 0 for i in range(2*N): for j in range(2*N): if grid[i][j] == '#': initial_sum += C[i][j] initial_k += 1 # Precompute for symmetric case symmetric_possible = (initial_k % 2 == 0) symmetric_max = -float('inf') if symmetric_possible: pairs = [] for i in range(2*N): for j in range(N): # Since j ranges from 0 to N-1 for 2N columns (0-based) j2 = 2*N - 1 - j # 0-based symmetric if j >= j2: continue # avoid duplicate c1 = C[i][j] c2 = C[i][j2] pairs.append(c1 + c2) x = initial_k // 2 if len(pairs) < x: symmetric_possible = False else: # Sort in descending order pairs.sort(reverse=True) selected = pairs[:x] sum_selected = sum(selected) symmetric_max = sum_selected + K # Precompute for non-symmetric case groupA = [] groupB = [] for i in range(2*N): for j in range(2*N): if grid[i][j] == '.': # s=0, delta is C[i][j] groupA.append(C[i][j]) else: # s=1, delta is -C[i][j] groupB.append(-C[i][j]) # Sort groupA in descending order groupA.sort(reverse=True) # Sort groupB in descending order (which is ascending of original C) groupB.sort(reverse=True) # Precompute prefix sums for groupA and groupB prefixA = [0] for c in groupA: prefixA.append(prefixA[-1] + c) prefixB = [0] for c in groupB: prefixB.append(prefixB[-1] + c) max_delta = -float('inf') max_x = min(len(groupA), len(groupB)) for x in range(0, max_x + 1): if x > len(prefixA)-1 or x > len(prefixB)-1: continue current = prefixA[x] + prefixB[x] if current > max_delta: max_delta = current non_symmetric_sum = initial_sum + max_delta if max_delta != -float('inf') else -float('inf') # Compare symmetric and non-symmetric candidates = [] if symmetric_possible: candidates.append(symmetric_max) candidates.append(non_symmetric_sum) result = max(candidates) print(result) if __name__ == "__main__": main()