結果
| 問題 | No.3391 Line up Dominoes |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-11-21 08:17:16 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
AC
|
| 実行時間 | 633 ms / 3,000 ms |
| コード長 | 1,215 bytes |
| コンパイル時間 | 17,141 ms |
| コンパイル使用メモリ | 404,016 KB |
| 実行使用メモリ | 7,848 KB |
| 最終ジャッジ日時 | 2025-11-28 20:57:36 |
| 合計ジャッジ時間 | 32,511 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 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);
}
//初項A_j以下の列の個数
let mut pre = vec![0;N+1];
let mut now = vec![0;N+1];
for i in 0..=N {now[i] = i;}
for _ in 2..=M{
pre = now.clone();
for i in 1..=N{
now[i]=(MOD+now[i-1]+pre[r[i]]-pre[l[i]])%MOD;
}
}
//eprintln!("{:?}",dp);
println!("{}",now[N]);
}