結果
| 問題 | No.2375 watasou and hibit's baseball | 
| コンテスト | |
| ユーザー |  lam6er | 
| 提出日時 | 2025-04-15 23:25:32 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 851 ms / 2,000 ms | 
| コード長 | 2,955 bytes | 
| コンパイル時間 | 274 ms | 
| コンパイル使用メモリ | 82,220 KB | 
| 実行使用メモリ | 136,236 KB | 
| 最終ジャッジ日時 | 2025-04-15 23:27:04 | 
| 合計ジャッジ時間 | 6,850 ms | 
| ジャッジサーバーID (参考情報) | judge5 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 36 | 
ソースコード
import sys
from collections import defaultdict
def main():
    N, A, B = map(int, sys.stdin.readline().split())
    balls = [tuple(map(int, sys.stdin.readline().split())) for _ in range(N)]
    X = [x for x, y, k in balls]
    Y = [y for x, y, k in balls]
    K = [k for x, y, k in balls]
    
    # 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 -> {(a_prev, b_prev): max_length}
    dp = defaultdict(dict)
    max_len = 1
    for i in range(N):
        mask = 1 << i
        a_prev = -1
        b_prev = i
        dp[mask][(a_prev, b_prev)] = 1
    
    # Process masks in order of increasing size
    for m in range(1, N + 1):
        # Get all masks with exactly m bits set
        masks = [mask for mask in dp if bin(mask).count('1') == m]
        for mask in masks:
            # Process each (a_prev, b_prev) pair in the current mask
            pairs = list(dp[mask].items())
            for (a_prev, b_prev), current_len in pairs:
                # Try adding each possible next ball
                for next_ball in range(N):
                    if mask & (1 << next_ball):
                        continue  # already used
                    new_mask = mask | (1 << next_ball)
                    new_a = b_prev
                    new_b = next_ball
                    j = current_len + 1
                    
                    # Check conditions based on j
                    if j == 2:
                        # Check condition 2 or 3
                        cond2 = dist[b_prev][next_ball] >= A
                        cond3 = k_diff[b_prev][next_ball] >= B
                        if cond2 or cond3:
                            new_len = j
                            key = (new_a, new_b)
                            if key not in dp[new_mask] or dp[new_mask].get(key, 0) < new_len:
                                dp[new_mask][key] = new_len
                                if new_len > max_len:
                                    max_len = new_len
                    else:
                        # j >=3, check condition 3 or 4
                        cond3 = k_diff[b_prev][next_ball] >= B
                        sum_dist = dist[a_prev][next_ball] + dist[b_prev][next_ball]
                        cond4 = sum_dist >= A
                        if cond3 or cond4:
                            new_len = j
                            key = (new_a, new_b)
                            if key not in dp[new_mask] or dp[new_mask].get(key, 0) < new_len:
                                dp[new_mask][key] = new_len
                                if new_len > max_len:
                                    max_len = new_len
    print(max_len)
if __name__ == "__main__":
    main()
            
            
            
        