https://atcoder.jp/contests/math-and-algorithm/tasks/abc178_b
xを固定すると、最大値は正ならd、負ならcになります。要するに、どちらにしても端だけを見ればよいです。
手元ではreduceが使えますが、AtCoderでは使えないんですね。
// Product Max #![allow(non_snake_case)] use std::cmp::max; //////////////////// library //////////////////// fn read<T: std::str::FromStr>() -> T { let mut line = String::new(); std::io::stdin().read_line(&mut line).ok(); line.trim().parse().ok().unwrap() } fn read_vec<T: std::str::FromStr>() -> Vec<T> { read::<String>().split_whitespace() .map(|e| e.parse().ok().unwrap()).collect() } //////////////////// process //////////////////// fn read_input() -> (i64, i64, i64, i64) { let v = read_vec(); let a = v[0]; let b = v[1]; let c = v[2]; let d = v[3]; (a, b, c, d) } fn f(a: i64, b: i64, c: i64, d: i64) -> i64 { let v = vec![a * c, a * d, b * c, b * d]; // v.into_iter().reduce(max).unwrap() v[1..].into_iter().fold(v[0], |x, y| max(x, *y)) } fn main() { let (a, b, c, d) = read_input(); println!("{}", f(a, b, c, d)) }