結果
| 問題 | 
                            No.2094 Symmetry
                             | 
                    
| コンテスト | |
| ユーザー | 
                             lam6er
                         | 
                    
| 提出日時 | 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()
            
            
            
        
            
lam6er