結果
| 問題 | No.3391 Line up Dominoes |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-10-19 20:57:44 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 2,402 ms / 3,000 ms |
| コード長 | 960 bytes |
| コンパイル時間 | 421 ms |
| コンパイル使用メモリ | 82,788 KB |
| 実行使用メモリ | 77,244 KB |
| 最終ジャッジ日時 | 2025-11-28 20:52:48 |
| 合計ジャッジ時間 | 56,044 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 |
ソースコード
import bisect
MOD = 998244353
# 1. 入力の受け取り
N, M, K = map(int, input().split())
A = list(map(int, input().split()))
# 2. 二分探索の前計算
A.sort()
L = [0]*N
R = [0]*N
for i in range(N):
L[i] = bisect.bisect_left(A, A[i] - K)
R[i] = bisect.bisect_left(A, A[i] + K + 1) - 1
R[i] += 1 # 1-indexed 用に 1を加算しておく
# 3. DP
dp1 = [0] * (N + 1)
dp2 = [0] * (N + 1)
DP1 = [0] * (N + 1)
DP2 = [0] * (N + 1)
for i in range(M):
for j in range(1, N + 1):
if i == 0:
dp1[j] = 1
elif i % 2 == 0:
dp1[j] = (DP2[R[j-1]] - DP2[L[j-1]] + MOD) % MOD
else:
dp2[j] = (DP1[R[j-1]] - DP1[L[j-1]] + MOD) % MOD
for j in range(1, N + 1):
if i % 2 == 0:
DP1[j] = (DP1[j - 1] + dp1[j]) % MOD
else:
DP2[j] = (DP2[j - 1] + dp2[j]) % MOD
# 4. 答えの出力
if M % 2 == 0:
print(DP2[N] % MOD)
else:
print(DP1[N] % MOD)