atcoder-solutionsatcoder-solutions
abc477_b

Standing Outliers の解説

abc477_b by @ohnuma

解説

計算量的に全探索もできますが xをソートしておけば左右が一番近い座標なので それらと>= dかどうかをみておけばO(N)で可能。

fn main() { input! { n: usize, d: isize, x: [isize; n] } let xi = x .iter() .enumerate() .map(|(idx, &e)| (e, idx)) .sorted_by_key(|&e| e.0) .collect_vec(); let ans = (0..n) .map(|i| { let (nn, ni) = xi[i]; let left = if i == 0 { isize::MIN / 2 } else { xi[i - 1].0 }; let right = xi.get(i + 1).unwrap_or(&(isize::MAX / 2, 0)).0; if nn - left >= d && right - nn >= d { ni + 1 } else { usize::MAX } }) .filter(|&e| e != usize::MAX) .sorted() .collect_vec(); println!("{}", ans.len()); println!("{}", ans.iter().join(" ")); }

コメント