結果
| 問題 | 
                            No.2003 Frog on Grid
                             | 
                    
| コンテスト | |
| ユーザー | 
                             lam6er
                         | 
                    
| 提出日時 | 2025-04-09 21:02:05 | 
| 言語 | PyPy3  (7.3.15)  | 
                    
| 結果 | 
                             
                                TLE
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 3,052 bytes | 
| コンパイル時間 | 245 ms | 
| コンパイル使用メモリ | 82,244 KB | 
| 実行使用メモリ | 102,964 KB | 
| 最終ジャッジ日時 | 2025-04-09 21:03:49 | 
| 合計ジャッジ時間 | 6,827 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge2 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 14 TLE * 1 -- * 11 | 
ソースコード
MOD = 998244353
H, W, K = map(int, input().split())
grid = [input().strip() for _ in range(H)]
dp = [[0] * (W + 1) for _ in range(H + 1)]
if grid[0][0] == '.':
    dp[1][1] = 1
else:
    print(0)
    exit()
from collections import defaultdict
diagonals = defaultdict(list)
prefix = defaultdict(list)
# Preprocess the diagonals and their prefix sums
for i in range(1, H + 1):
    for j in range(1, W + 1):
        s = i + j
        if grid[i-1][j-1] == '#':
            continue
        diagonals[s].append((i, j))
for s in diagonals:
    # Sort the cells in diagonal s by their row i
    cells = sorted(diagonals[s], key=lambda x: x[0])
    pr = []
    current_sum = 0
    for (i, j) in cells:
        # The value is 0 for now; will be updated after computing dp[i][j]
        pr.append((i, current_sum))
    prefix[s] = pr
# Process each cell in order of increasing i + j
for s in sorted(prefix.keys()):
    cells_in_s = sorted(diagonals[s], key=lambda x: x[0])
    for idx, (i, j) in enumerate(cells_in_s):
        if i == 1 and j == 1:
            continue  # already initialized
        if grid[i-1][j-1] == '#':
            dp[i][j] = 0
            continue
        
        current_s = i + j
        min_s = max(2, current_s - K)
        max_s = current_s - 1
        total = 0
        
        for t in range(min_s, max_s + 1):
            if t not in prefix or len(prefix[t]) == 0:
                continue
            
            # Determine the valid x range for diagonal t
            max_x = i  # x <= i
            min_x = max(1, t - j)  # y = t - x <= j => x >= t - j
            if min_x > max_x:
                continue
            
            # Find the range in prefix[t]
            low, high = 0, len(prefix[t]) - 1
            left = -1
            while low <= high:
                mid = (low + high) // 2
                if prefix[t][mid][0] >= min_x:
                    left = mid
                    high = mid - 1
                else:
                    low = mid + 1
            if left == -1:
                continue
            
            right = -1
            low, high = left, len(prefix[t]) - 1
            while low <= high:
                mid = (low + high) // 2
                if prefix[t][mid][0] <= max_x:
                    right = mid
                    low = mid + 1
                else:
                    high = mid - 1
            if right == -1:
                continue
            
            # Sum from left to right
            sum_val = (prefix[t][right][1] - (prefix[t][left-1][1] if left > 0 else 0)) % MOD
            total = (total + sum_val) % MOD
        
        dp[i][j] = total % MOD
    
    # Update the prefix sums for this diagonal s after processing all cells
    pr = []
    current_sum = 0
    for idx, (i, j) in enumerate(cells_in_s):
        current_sum = (current_sum + dp[i][j]) % MOD
        if idx == 0:
            pr.append((i, current_sum))
        else:
            pr.append((i, (pr[-1][1] + dp[i][j]) % MOD))
    prefix[s] = pr
print(dp[H][W] % MOD)
            
            
            
        
            
lam6er