Open8
Rust AtCoder メモ
lower_bound
及びupper_bound
Vecで
use superslice::Ext;
vct.lower_bound(&x); //戻り値はindex
累積和
itertools_num
のcumsumを使う
once(0).chain(iter)は0の単体イテレータとiterをつなぐ
use itertools_num::ItertoolsNum;
let cum = std::iter::once(0).chain(vct.into_iter().cumsum()).collect::Vec<_>();
sliceの全ての要素が等しい
itertools
のall_equalを使う
use itertools::Itertools;
[1, 2, 3, 4].into_iter().all_equal(); //false
ソート済みSliceにある要素が存在するかを二分探索で判定
if let Ok(_) = [1, 2, 3, 4].binary_search(&x);
floatでsort
NaNが存在しないことが保証されているときのみ
vct.sort_by(|&i, &j| i.partial_cmp(&j).unwrap());
Rustで集合
和集合 ⇒ union
差集合 ⇒ difference
積集合 ⇒ intersection
対称差 ⇒ symmetric_difference
数を求めるにはcount
を使う
use std::collections::HashSet;
let a: HashSet<_> = [1, 2, 3, 4].into_iter().collect();
let b: HashSet<_> = [3, 4, 5, 6].into_iter().collect();
println!("{}", a.union(&b).count); //6
昇順優先queue
use std::collections::BinaryHeap;
use std::cmp::Reverse;
let mut bh = BinaryHeap::<Reverse<_>>::new();
bh.push(Reverse(3));
bh.push(Reverse(1));
bh.push(Reverse(2));
println!("{}", bh.pop().unwrap().0); //1
Vecでrfind
let hoge = s
.iter()
.enumerate()
.rev()
.find(|(_, &x)| x == 42)
.and_then(|(idx, _)| idx)
// もっといいやりかたあるかも...