結果
| 問題 | No.2375 watasou and hibit's baseball | 
| コンテスト | |
| ユーザー |  lam6er | 
| 提出日時 | 2025-04-15 23:22:59 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                TLE
                                 
                             | 
| 実行時間 | - | 
| コード長 | 2,532 bytes | 
| コンパイル時間 | 357 ms | 
| コンパイル使用メモリ | 82,008 KB | 
| 実行使用メモリ | 274,880 KB | 
| 最終ジャッジ日時 | 2025-04-15 23:24:41 | 
| 合計ジャッジ時間 | 11,738 ms | 
| ジャッジサーバーID (参考情報) | judge5 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 35 TLE * 1 | 
ソースコード
import sys
from collections import deque
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_diff matrices
    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])
    
    dp = dict()
    max_len = 1
    queue = deque()
    
    # Initialize with each ball as the first in the sequence
    for i in range(N):
        mask = 1 << i
        state = (-1, i, mask)
        dp[state] = 1
        queue.append((state, 1))
    
    while queue:
        state, current_len = queue.popleft()
        if dp.get(state, 0) > current_len:
            continue  # Skip if a better state has already been processed
        prev_pp, prev_p, mask = state
        
        # Try adding each possible next ball
        for c in range(N):
            if (mask & (1 << c)) != 0:
                continue  # Skip if ball c is already used
            
            new_mask = mask | (1 << c)
            if prev_pp == -1:
                # Adding the second ball to the sequence
                a = prev_p
                b = c
                if dist[a][b] >= A or k_diff[a][b] >= B:
                    new_state = (a, b, new_mask)
                    new_len = current_len + 1
                    if new_len > dp.get(new_state, 0):
                        dp[new_state] = new_len
                        if new_len > max_len:
                            max_len = new_len
                        queue.append((new_state, new_len))
            else:
                # Adding the third or later ball
                a = prev_pp
                b = prev_p
                c_ball = c
                cond3 = (k_diff[b][c_ball] >= B)
                cond4 = (dist[b][c_ball] + dist[a][c_ball] >= A)
                if cond3 or cond4:
                    new_state = (b, c_ball, new_mask)
                    new_len = current_len + 1
                    if new_len > dp.get(new_state, 0):
                        dp[new_state] = new_len
                        if new_len > max_len:
                            max_len = new_len
                        queue.append((new_state, new_len))
    
    print(max_len)
if __name__ == '__main__':
    main()
            
            
            
        