結果
問題 |
No.3052 Increasing Sliding Window Minimum
|
ユーザー |
|
提出日時 | 2024-02-10 00:11:18 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 517 ms / 2,000 ms |
コード長 | 1,214 bytes |
コンパイル時間 | 317 ms |
コンパイル使用メモリ | 82,456 KB |
実行使用メモリ | 79,744 KB |
最終ジャッジ日時 | 2025-01-25 15:02:31 |
合計ジャッジ時間 | 9,327 ms |
ジャッジサーバーID (参考情報) |
judge7 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 42 |
ソースコード
from typing import List K = 2 MOD = 998244353 def solve(n, a: List[int]): inv_a = [-1] * (n + 1) for i in range(1, n + 1): if a[i] != -1: inv_a[a[i]] = i cnt = [0] * (n + 1) for i in range(1, n + 1): cnt[i] = cnt[i - 1] + int(a[i] != -1) pd = [1] + [0] * n for v in range(1, n + 1): i = inv_a[v] if i != -1: for j in range(i, n + 1): cnt[j] -= 1 dp = [0] * (n + 1) for r in range(n + 1): if pd[r] == 0: continue for d in range(1, K + 1): if r + d > n: break if a[r + d] != -1 and a[r + d] != v: continue if a[r + d] == -1 and inv_a[v] != -1: continue dp[r + d] += pd[r] if inv_a[v] == -1: dp[r] += (r - (v - 1) - cnt[r]) * pd[r] elif inv_a[v] <= r: dp[r] += pd[r] for i in range(n + 1): pd[i] = dp[i] % MOD return pd[n] T = int(input()) for _ in range(T): n = int(input()) a = [-1] + list(map(int, input().split())) print(solve(n, a))