結果
| 問題 | No.3391 Line up Dominoes |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-11-21 08:11:16 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 1,201 bytes |
| コンパイル時間 | 12,809 ms |
| コンパイル使用メモリ | 398,124 KB |
| 実行使用メモリ | 784,000 KB |
| 最終ジャッジ日時 | 2025-11-28 20:56:59 |
| 合計ジャッジ時間 | 40,941 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | MLE * 23 |
ソースコード
#![allow(unused)]
#![allow(non_snake_case)]
#![allow(dead_code)]
pub fn bsearch_irange<F>(mut l: usize, mut r: usize, f: F) -> usize
where
F: Fn(usize) -> bool,
{
while l < r {
let m = l + (r - l) / 2;
if f(m) {
r = m;
} else {
l = m + 1;
}
}
l
}
fn main() {
let input_str = std::io::read_to_string(std::io::stdin()).unwrap();
let mut input = input_str.split_whitespace();
let mut read_int = ||->usize {input.next().unwrap().parse().unwrap()};
const MOD:usize = 998244353;
let (N,M,K)=(read_int(),read_int(),read_int());
let mut A:Vec<usize> = (0..N).map(|_| read_int()).collect();
A.sort();
let mut l = vec![0;N+1];
let mut r = vec![0;N+1];
for i in 0..N{
l[i+1] = bsearch_irange(0,N,|j| A[j]+K >= A[i]);
r[i+1] = bsearch_irange(0,N,|j| A[j] > A[i]+K);
}
//dp[i][j]:長さi,初項A_j以下の列の個数
let mut dp = vec![vec![0;N+1];M+1];
for j in 0..=N {dp[1][j] = j;}
for i in 2..=M{
for j in 1..=N{
dp[i][j]=(MOD+dp[i][j-1]+dp[i-1][r[j]]-dp[i-1][l[j]])%MOD;
}
}
//eprintln!("{:?}",dp);
println!("{}",dp[M][N]);
}