結果
| 問題 | No.2375 watasou and hibit's baseball | 
| コンテスト | |
| ユーザー |  lam6er | 
| 提出日時 | 2025-04-15 23:23:39 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 873 ms / 2,000 ms | 
| コード長 | 2,976 bytes | 
| コンパイル時間 | 166 ms | 
| コンパイル使用メモリ | 82,176 KB | 
| 実行使用メモリ | 134,448 KB | 
| 最終ジャッジ日時 | 2025-04-15 23:25:12 | 
| 合計ジャッジ時間 | 6,699 ms | 
| ジャッジサーバーID (参考情報) | judge1 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 36 | 
ソースコード
import sys
from collections import defaultdict
def main():
    N, A, B = map(int, sys.stdin.readline().split())
    X = []
    Y = []
    K = []
    for _ in range(N):
        x, y, k = map(int, sys.stdin.readline().split())
        X.append(x)
        Y.append(y)
        K.append(k)
    
    # Precompute distance and K differences
    dist = [[0] * N for _ in range(N)]
    k_diff = [[0] * N for _ in range(N)]
    for i in range(N):
        for j in range(N):
            dist[i][j] = abs(X[i] - X[j]) + abs(Y[i] - Y[j])
            k_diff[i][j] = abs(K[i] - K[j])
    
    # Initialize DP: mask -> {(prev, prev_prev): max_length}
    dp = defaultdict(dict)
    for i in range(N):
        mask = 1 << i
        dp[mask][(i, -1)] = 1
    
    max_len = 1
    
    current_bit_count = 1
    while current_bit_count <= N:
        # Get all masks with current_bit_count bits
        masks_to_process = []
        for mask in list(dp.keys()):
            if bin(mask).count('1') == current_bit_count:
                masks_to_process.append(mask)
        
        if not masks_to_process:
            current_bit_count += 1
            continue
        
        for mask in masks_to_process:
            states = dp[mask]
            for (prev, prev_prev), length in states.items():
                # Try adding each possible w not in mask
                for w in range(N):
                    if (mask & (1 << w)) != 0:
                        continue
                    # Check conditions
                    if prev_prev == -1:
                        # j=2
                        cond2 = (dist[prev][w] >= A)
                        cond3 = (k_diff[prev][w] >= B)
                        if cond2 or cond3:
                            new_mask = mask | (1 << w)
                            new_state = (w, prev)
                            new_length = length + 1
                            # Update dp
                            if new_state not in dp[new_mask] or dp[new_mask].get(new_state, 0) < new_length:
                                dp[new_mask][new_state] = new_length
                                if new_length > max_len:
                                    max_len = new_length
                    else:
                        # j >=3
                        cond3 = (k_diff[prev][w] >= B)
                        cond4 = (dist[prev][w] + dist[prev_prev][w] >= A)
                        if cond3 or cond4:
                            new_mask = mask | (1 << w)
                            new_state = (w, prev)
                            new_length = length + 1
                            if new_state not in dp[new_mask] or dp[new_mask].get(new_state, 0) < new_length:
                                dp[new_mask][new_state] = new_length
                                if new_length > max_len:
                                    max_len = new_length
        current_bit_count += 1
    
    print(max_len)
if __name__ == "__main__":
    main()
            
            
            
        