Open8

Rust AtCoder メモ

朱信朱信

累積和

itertools_numcumsumを使う

once(0).chain(iter)は0の単体イテレータとiterをつなぐ

use itertools_num::ItertoolsNum;

let cum = std::iter::once(0).chain(vct.into_iter().cumsum()).collect::Vec<_>();
朱信朱信

sliceの全ての要素が等しい

itertoolsall_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)

// もっといいやりかたあるかも...