Open3

Rust 競プロ snippet

とがとが

proconio

use proconio::input;
#[allow(unused_imports)]
use proconio::marker::{Bytes, Chars, Isize1, Usize1};

input! マクロはほぼ確実に使うのに対し,各 marker は使うとは限らないので allow(unused_imports) を付けておくという考え.

とがとが
#[allow(dead_code)]
fn update<T: PartialOrd>(value: T, target: &mut T, cond: std::cmp::Ordering) {
    if value.partial_cmp(target) == Some(cond) {
        *target = value;
    }
}

#[allow(unused_macros)]
macro_rules! chmax {
    ($target:expr, $value:expr) => {
        update($value, &mut $target, std::cmp::Ordering::Greater)
    };
}
#[allow(unused_macros)]
macro_rules! chmin {
    ($target:expr, $value:expr) => {
        update($value, &mut $target, std::cmp::Ordering::Less)
    };
}

chmax!(x, y)chmin!(x, y).更新される変数が x で,更新に用いられる値が y.ライフタイムとかはあんまり気にしなくていい.

使用例
let mut v = vec![1, 2, 3, 4];
chmax!(v[0], v[2]);
chmin!(v[3], v[1]);
assert_eq!(v, [3, 2, 3, 2]);