use proconio::input; type Coord = (i64, i64); fn main() { println!("{}", if solve() { "Yes" } else { "No" }); } fn solve() -> bool { input! { n: usize, xy: [(i64, i64); n], } let pivot_coord = *xy.iter().min().unwrap(); let mut sorted_xy = xy .iter() .cloned() .filter(|&coord| coord != pivot_coord) .collect::>(); sorted_xy.sort_unstable_by(|&coord1, &coord2| compare_angle(pivot_coord, coord1, coord2)); let mut stack = vec![pivot_coord]; for &coord in sorted_xy.iter().chain(&[pivot_coord]) { if stack.len() >= 2 { if compare_angle(stack[stack.len() - 2], stack[stack.len() - 1], coord).is_ge() { return false; } } stack.push(coord); } true } fn calc_diff(from: Coord, to: Coord) -> Coord { (to.0 - from.0, to.1 - from.1) } fn compare_angle(pivot_coord: Coord, coord1: Coord, coord2: Coord) -> std::cmp::Ordering { let (dx1, dy1) = calc_diff(pivot_coord, coord1); let (dx2, dy2) = calc_diff(pivot_coord, coord2); (dx2 * dy1).cmp(&(dx1 * dy2)) }