AtCoder Beginner Contest 279 D(2)

https://atcoder.jp/contests/abc279/tasks/abc279_d

微分を使わなくても、3点の区間を倍々にしていって、3点の中で真ん中が一番時間が短ければ、そこから真ん中が一番時間が短い状態をキープしつつ区間を縮小していきます。

// Freefall
#![allow(non_snake_case)]


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()
}

fn read_input() -> (u64, u64) {
    let v = read_vec();
    (v[0], v[1])
}

fn time(g: u64, A: u64, B: u64) -> f64 {
    (A as f64) / (g as f64).sqrt() + (B * (g - 1)) as f64
}

fn find_increasing_point(g2: u64, t2: f64, A: u64, B: u64) -> u64 {
    let g3 = g2 * 2;
    let t3 = time(g3, A, B);
    if t2 < t3 {
        g2
    }
    else {
        find_increasing_point(g3, t3, A, B)
    }
}

fn find_min_time(g1: u64, g2: u64, g3: u64, A: u64, B: u64) -> f64 {
    if g1 == g2 - 1 && g2 == g3 - 1 {
        return time(g2, A, B)
    }
    let g4 = (g1 + g2) / 2;
    let g5 = (g2 + g3) / 2;
    
    let t4 = time(g4, A, B);
    let t2 = time(g2, A, B);
    let t5 = time(g5, A, B);
    if t2 <= t4 && t2 <= t5 {
        find_min_time(g4, g2, g5, A, B)
    }
    else if t4 <= t2 && t4 <= t5 {
        find_min_time(g1, g4, g2, A, B)
    }
    else {
        find_min_time(g2, g5, g3, A, B)
    }
}

fn f(A: u64, B: u64) -> f64 {
    let t1 = time(1, A, B);
    let t2 = time(2, A, B);
    if t1 < t2 {
        return t1
    }
    
    let g = find_increasing_point(2, t2, A, B);
    find_min_time(g / 2, g, g * 2, A, B)
}

fn main() {
    let v = read_input();
    println!("{}", f(v.0, v.1))
}

AtCoder Beginner Contest 279 D

https://atcoder.jp/contests/abc279/tasks/abc279_d

微分して0になる点から、前後を調べます。ただし、1より小さくなってはいけません。

// Freefall
#![allow(non_snake_case)]


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()
}

fn read_input() -> (u64, u64) {
    let v = read_vec();
    (v[0], v[1])
}

fn time(g: u64, A: u64, B: u64) -> f64 {
    (A as f64) / (g as f64).sqrt() + (B * (g - 1)) as f64
}

fn find_min_time(g0: u64, inc: bool, A: u64, B: u64) -> f64 {
    let t0 = time(g0, A, B);
    if g0 == 1 && !inc {
        return t0
    }
    
    let g = if inc { g0 + 1 } else { g0 - 1 };
    let t1 = time(g, A, B);
    if t0 < t1 {
        t0
    }
    else {
        find_min_time(g, inc, A, B)
    }
}

fn f(A: u64, B: u64) -> f64 {
    let g0: u64 = u64::max(1,
                    ((A as f64) / ((B * 2) as f64)).powf(2.0 / 3.0) as u64);
    return f64::min(find_min_time(g0, true, A, B),
                    find_min_time(g0, false, A, B))
}

fn main() {
    let v = read_input();
    println!("{}", f(v.0, v.1))
}

AtCoder Beginner Contest 280 D

https://atcoder.jp/contests/abc280/tasks/abc280_d

素因数分解すれば、あとは素数ごとに計算すればよいですね。
素数ごとに条件を満たす最小の倍数を求める部分はもっと効率のいい方法があると思いますが、素因数分解に比べれば十分に速いですね。

// Factorial and Multiple
#![allow(non_snake_case)]

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 div_pow(n: i64, d: i64) -> (u32, i64) {
    if n % d == 0 {
        let (e, m) = div_pow(n / d, d);
        (e + 1, m)
    }
    else {
        (0, n)
    }
}

type Factors = Vec<(i64, u32)>;

fn factorize(n: i64, p0: i64) -> Factors {
    if n == 1 {
        return vec![]
    }
    
    for p in p0.. {
        if p * p > n {
            break
        }
        if n % p == 0 {
            let (e, m) = div_pow(n, p);
            let factors = factorize(m, p + 1);
            let mut new_factors = vec![(p, e)];
            new_factors.extend(&factors);
            return new_factors
        }
    }
    vec![(n, 1)]
}

fn num_primes(n: i64, p: i64) -> u32 {
    let mut num = 0;
    let mut q = p;
    while q <= n {
        num += n / q;
        q *= p
    }
    num as u32
}

fn min_num((p, e): (i64, u32)) -> i64 {
    for n in (p..).step_by(p as usize) {
        if num_primes(n, p) >= e {
            return n
        }
    }
    p
}

fn f(K: i64) -> i64 {
    let fs = factorize(K, 2);
    fs.into_iter().map(|f| min_num(f)).max().unwrap()
}

fn main() {
    let K: i64 = read();
    println!("{}", f(K))
}

AtCoder Beginner Contest 272 D(2)

https://atcoder.jp/contests/abc272/tasks/abc272_d

素因数分解さえできれば、移動できるステップを高速に求められます。そのために、GaussIntという構造体を作りました。
デバッグのためにfmtというメソッドを作って複素数を出力できるようにしましたが、その中で

            write!(f, "{}", self.re)?;

などとしていますが、?はwrite!でエラーが出たときはそのエラーをそのまま返せるようにする記号です。
この規模だと速くはなりませんね。

// Root M Leaper
#![allow(non_snake_case)]

use std::ops::{Add, Mul};
use std::collections::VecDeque;
use std::fmt;

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()
}

fn read_input() -> (i32, i32) {
    let v = read_vec();
    (v[0], v[1])
}

fn div_pow(n: i32, d: i32) -> (i32, i32) {
    if n % d == 0 {
        let (e, m) = div_pow(n / d, d);
        (e + 1, m)
    }
    else {
        (0, n)
    }
}


//////////////////// Factors ////////////////////

type Factors = Vec<(i32, i32)>;

fn factorize(n: i32, p0: i32) -> Factors {
    if n == 1 {
        return vec![]
    }
    
    for p in p0.. {
        if p * p > n {
            break
        }
        if n % p == 0 {
            let (e, m) = div_pow(n, p);
            let factors = factorize(m, p + 1);
            let mut new_factors = vec![(p, e)];
            new_factors.extend(&factors);
            return new_factors
        }
    }
    vec![(n, 1)]
}

fn pow_mod(n: i32, e: i32, d: i32) -> i32 {
    if e == 1 {
        n
    }
    else if e % 2 == 0 {
        let m = pow_mod(n, e / 2, d);
        ((m as i64) * (m as i64) % (d as i64)) as i32
    }
    else {
        let m = pow_mod(n, e - 1, d);
        ((m as i64) * (n as i64) % (d as i64)) as i32
    }
}


//////////////////// Point ////////////////////

#[derive(Clone, Copy)]
#[derive(Debug)]
#[derive(Eq, Hash, PartialEq)]
struct Point {
    x: i32,
    y: i32,
}

impl Add for Point {
    type Output = Self;
    
    fn add(self, other: Self) -> Self {
        Self { x: self.x + other.x, y: self.y + other.y }
    }
}

// rotate 90 degrees
fn rotate(dir: &Point) ->  Point {
    Point { x: -dir.y, y: dir.x }
}

// reflect on x + y = 0
fn reflect(dir: &Point) -> Point {
    Point { x: dir.y, y: dir.x }
}

fn expand_dirs(dir: Point) -> Vec<Point> {
    let mut dirs = Vec::<Point>::new();
    dirs.push(dir);
    for i in 0..3 {
        dirs.push(rotate(&dirs[i]))
    }
    if dir.x != dir.y && dir.x != 0 && dir.y != 0 {
        for i in 0..4 {
            dirs.push(reflect(&dirs[i]))
        }
    }
    dirs
}


//////////////////// GaussInt ////////////////////

#[derive(Clone, Copy)]
struct GaussInt {
    re: i32,
    im: i32
}

impl Mul for GaussInt {
    type Output = Self;
    
    fn mul(self, other: Self) -> Self {
        let re = self.re * other.re - self.im * other.im;
        let im = self.re * other.im + self.im * other.re;
        Self { re, im }
    }
}

impl fmt::Display for GaussInt {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        if self.re != 0 {
            write!(f, "{}", self.re)?;
            if self.im > 0 {
                write!(f, "+")?;
            }
        }
        else if self.im == 0 {
            write!(f, "0")?
        }
        if self.im == 1 {
            write!(f, "i")?
        }
        else if self.im == -1 {
            write!(f, "-i")?
        }
        else if self.im == 0 {
            return Ok(())
        }
        else {
            write!(f, "{}i", self.im)?
        };
        return Ok(())
    }
}

impl GaussInt {
    fn conjugate(&self) -> GaussInt {
        GaussInt { re: self.re, im: -self.im }
    }
    
    fn rotate90(&self) -> GaussInt {
        GaussInt { re: -self.im, im: self.re }
    }
    
    fn is_normal(&self) -> bool {
        self.re > 0 && self.re > self.im.abs()
    }
    
    // i^eを掛けて、re > 0, |re| > |im|にする
    fn normalize(&self) -> GaussInt {
        let mut c = *self;
        for _ in 0..4 {
            if c.is_normal() {
                return c
            }
            c = c.rotate90()
        }
        c   // ここには来ないはず
    }
    
    // k^2 + 1 ≡ 0(mod p)となるkを見つける
    fn find_i(p: i32) -> i32 {
        let e = p - 1;
        for a in 2..p {
            let k = pow_mod(a, e / 2, p);
            if k == p - 1 {
                return pow_mod(a, e / 4, p)
            }
        }
        1   // ここには来ないはず
    }
    
    fn gcd(z1: &GaussInt, z2: &GaussInt) -> GaussInt {
        if z2.im == 0 {
            return *z1
        }
        else {
            let z3 = z2.normalize();
            let q = z1.re / z3.re;
            let r = z1.re % z3.re;
            let z4 = GaussInt { re: r, im: z1.im - q * z3.im };
            GaussInt::gcd(&z3, &z4)
        }
    }
    
    fn pow(&self, e: i32) -> GaussInt {
        if e == 0 {
            GaussInt { re: 1, im: 0 }
        }
        else if e == 1 {
            *self
        }
        else if e % 2 == 0 {
            let z = self.pow(e / 2);
            z * z
        }
        else {
            *self * self.pow(e - 1)
        }
    }
    
    // 4n+1型素数をガウス整数に分解する
    fn divide_prime(p: i32) -> GaussInt {
        let k = GaussInt::find_i(p);
        let z1 = GaussInt { re: p, im: 0 };
        let z2 = GaussInt { re: k, im: 1 };
        let z = GaussInt::gcd(&z1, &z2);
        GaussInt { re: z.re, im: z.im.abs() }
    }
}

fn powers(z: GaussInt, e: i32, num_e: i32) -> Vec<GaussInt> {
    let zc = z.conjugate();
    (0..num_e).map(|i| z.pow(e-i) * zc.pow(i)).collect()
}

fn expand_zs(zs0: Vec<GaussInt>, (p, e): (i32, i32),
                            head: bool) -> (Vec<GaussInt>, bool) {
    let (ne, new_head) = if p == 2 { (1, head) }
                            else if head { (e/2 + 1, false) }
                            else { (e+1, false) };
    let zs = if p == 2 { vec![(GaussInt { re: 1, im: 1 }).pow(e)] }
                else if p % 4 == 1 { powers(GaussInt::divide_prime(p), e, ne) }
                else { vec![GaussInt { re: p.pow((e/2) as u32), im: 0 }] };
    (zs0.iter().map(|&z0| zs.iter().map(|&z| z0*z).collect::<Vec<GaussInt>>()).
                                                flatten().collect(), new_head)
}

fn find_normal_dirs(factors: &Factors, first: bool) -> Vec<GaussInt> {
    let zs0 = vec![GaussInt { re: 1, im: 0 }];
    let p = factors.iter().fold((zs0, first),
                                |(zs, head), &fs| expand_zs(zs, fs, head));
    p.0
}

fn find_movable_dirs(M: i32) -> Vec<Point> {
    let factors = factorize(M, 2);
    if factors.iter().any(|&(p, e)| p % 4 == 3 && e % 2 == 1) {
        return vec![]
    }
    
    let zs = find_normal_dirs(&factors, true);
    zs.into_iter().map(|z| expand_dirs(Point { x: z.re, y: z.im })).
                                        flatten().collect::<Vec<Point>>()
}

fn make_table(N: i32, M: i32) -> Vec<Vec<i32>> {
    let mut table: Vec<Vec<i32>>
                = (0..N).map(|_| (0..N).map(|_| -1).collect()).collect();
    table[0][0] = 0;
    let dirs = find_movable_dirs(M);
    let mut queue = VecDeque::<Point>::new();
    queue.push_back(Point { x: 0, y: 0 });
    while queue.len() > 0 {
        let pt0 = queue.pop_front().unwrap();
        let x0 = pt0.x as usize;
        let y0 = pt0.y as usize;
        for dir in dirs.iter() {
            let pt = pt0 + *dir;
            let x = pt.x as usize;
            let y = pt.y as usize;
            if 0 <= pt.x && pt.x < N && 0 <= pt.y && pt.y < N &&
                                                    table[x][y] == -1 {
                table[x][y] = table[x0][y0] + 1;
                queue.push_back(pt)
            }
        }
    }
    table
}

fn print_table(table: Vec<Vec<i32>>) {
    for v in table.into_iter() {
        println!("{}", v.iter().map(|n| n.to_string()).
                            collect::<Vec<String>>().join(" "))
    }
}

fn f(N: i32, M: i32) {
    let table = make_table(N, M);
    print_table(table)
}

fn main() {
    let v = read_input();
    f(v.0, v.1)
}

AtCoder Beginner Contest 272 D

https://atcoder.jp/contests/abc272/tasks/abc272_d

どこへ進めるかはナイーブに実装しても十分に間に合いますね。
何歩で行けるかはQueueを使えばよいですが、RustではVecDequeというcollectionを使うようです。

// Root M Leaper
#![allow(non_snake_case)]

use std::ops::Add;
use std::collections::VecDeque;

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()
}

fn read_input() -> (i32, i32) {
    let v = read_vec();
    (v[0], v[1])
}

#[derive(Clone, Copy)]
#[derive(Debug)]
struct Point {
    x: i32,
    y: i32,
}

impl Add for Point {
    type Output = Self;
    
    fn add(self, other: Self) -> Self {
        Self { x: self.x + other.x, y: self.y + other.y }
    }
}

// rotate 90 degrees
fn rotate(dir: &Point) ->  Point {
    Point { x: -dir.y, y: dir.x }
}

// reflect on x + y = 0
fn reflect(dir: &Point) -> Point {
    Point { x: dir.y, y: dir.x }
}

fn expand_dirs(dir: Point) -> Vec<Point> {
    let mut dirs = Vec::<Point>::new();
    dirs.push(dir);
    for i in 0..3 {
        dirs.push(rotate(&dirs[i]))
    }
    if dir.x != dir.y && dir.x != 0 && dir.y != 0 {
        for i in 0..4 {
            dirs.push(reflect(&dirs[i]))
        }
    }
    dirs
}

fn find_movable_dirs(M: i32) -> Vec<Point> {
    let mut dirs = Vec::<Point>::new();
    for x in 0.. {
        let y = ((M - x*x) as f64).sqrt().floor() as i32;
        if y < x {
            break;
        }
        if x*x + y*y == M {
            dirs.push(Point { x, y });
        }
    }
    dirs.into_iter().map(|dir| expand_dirs(dir)).
                            flatten().collect::<Vec<Point>>()
}

fn make_table(N: i32, M: i32) -> Vec<Vec<i32>> {
    let mut table: Vec<Vec<i32>>
                = (0..N).map(|_| (0..N).map(|_| -1).collect()).collect();
    table[0][0] = 0;
    let dirs = find_movable_dirs(M);
    let mut queue = VecDeque::<Point>::new();
    queue.push_back(Point { x: 0, y: 0 });
    while queue.len() > 0 {
        let pt0 = queue.pop_front().unwrap();
        let x0 = pt0.x as usize;
        let y0 = pt0.y as usize;
        for dir in dirs.iter() {
            let pt = pt0 + *dir;
            let x = pt.x as usize;
            let y = pt.y as usize;
            if 0 <= pt.x && pt.x < N && 0 <= pt.y && pt.y < N &&
                                                    table[x][y] == -1 {
                table[x][y] = table[x0][y0] + 1;
                queue.push_back(pt)
            }
        }
    }
    table
}

fn print_table(table: Vec<Vec<i32>>) {
    for v in table.into_iter() {
        println!("{}", v.iter().map(|n| n.to_string()).
                            collect::<Vec<String>>().join(" "))
    }
}

fn f(N: i32, M: i32) {
    let table = make_table(N, M);
    print_table(table)
}

fn main() {
    let v = read_input();
    f(v.0, v.1)
}

AtCoder Beginner Contest 273 D

https://atcoder.jp/contests/abc273/tasks/abc273_d

これも行と列で分けて考えることができます。
壁の座標を各行、各列で格納します。
その際に二分探索をするのでソートしますが、HashMapの中のVecをどうソートしていいのか分からなかったので、新たにHashMapを構築しました。

// LRUD Instructions
#![allow(non_snake_case)]

use std::collections::HashMap;
use std::cmp::min;
use std::cmp::max;

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()
}

struct Point {
    x: i32,
    y: i32,
}

fn read_point() -> Point {
    let v: Vec<i32> = read::<String>().split_whitespace()
                    .map(|e| e.parse().ok().unwrap()).collect();
    Point { x: v[1], y: v[0] }
}

fn read_input() -> (i32, i32, Point, Vec<Point>, Vec<(char, i32)>) {
    let v = read_vec();
    let H: i32 = v[0];
    let W: i32 = v[1];
    let pt0 = Point { x: v[3], y: v[2] };
    let N: i32 = read();
    let walls: Vec<Point> = (0..N).map(|_| read_point()).collect();
    let Q: i32 = read();
    let queries: Vec<(char, i32)> = (0..Q).map(|_| read_vec::<String>()).
                map(|v| (v[0].chars().next().unwrap(), v[1].parse().unwrap())).
                collect();
    (H, W, pt0, walls, queries)
}

struct Walls {
    walls: Vec<i32>
}

impl Walls {
    fn push(&mut self, x: i32) {
        self.walls.push(x)
    }
    
    fn find_range(&self, x: i32, first: usize, last: usize) -> usize {
        if first == last - 1 {
            first
        }
        else {
            let mid = (first + last) / 2;
            if x < self.walls[mid] {
                self.find_range(x, first, mid)
            }
            else {
                self.find_range(x, mid, last)
            }
        }
    }
    
    fn walk_x(&self, x: i32, n: i32) -> i32 {
        let first = self.find_range(x, 0, self.walls.len() - 1);
        if n > 0 {
            let upper = self.walls[first+1] - 1;
            min(upper, x + n)
        }
        else {
            let lower = self.walls[first] + 1;
            max(lower, x + n)
        }
    }
}

struct Board {
    H: i32,
    W: i32,
    HWalls: HashMap<i32, Walls>,
    VWalls: HashMap<i32, Walls>,
}

impl Board {
    fn walk(&self, pt: Point, query: &(char, i32)) -> Point {
        match *query {
            ('L', n) => self.walk_x(pt, -n),
            ('R', n) => self.walk_x(pt,  n),
            ('U', n) => self.walk_y(pt, -n),
            ('D', n) => self.walk_y(pt,  n),
            _   => pt
        }
    }
    
    fn walk_x(&self, pt: Point, n: i32) -> Point {
        match self.HWalls.get(&pt.y) {
            Some(walls) => Point { x: walls.walk_x(pt.x, n), y: pt.y },
            None        => {
                if n > 0 {
                    Point { x: min(pt.x + n, self.W), y: pt.y }
                } else { 
                    Point { x: max(pt.x + n, 1), y: pt.y }
                }
            }
        }
    }
    
    fn walk_y(&self, pt: Point, n: i32) -> Point {
        match self.VWalls.get(&pt.x) {
            Some(walls) => Point { x: pt.x, y: walls.walk_x(pt.y, n) },
            None        => {
                if n > 0 {
                    Point { x: pt.x, y: min(pt.y + n, self.H) }
                }
                else {
                    Point { x: pt.x, y: max(pt.y + n, 1) }
                }
            }
        }
    }
    
    fn create(H: i32, W: i32, walls: &Vec<Point>) -> Board {
        let mut walls1 = HashMap::<i32, Walls>::new();
        let mut walls2 = HashMap::<i32, Walls>::new();
        for wall in walls.iter() {
            let v = walls1.entry(wall.y).or_insert(Walls { walls: vec![] });
            v.push(wall.x);
            let w = walls2.entry(wall.x).or_insert(Walls { walls: vec![] });
            w.push(wall.y);
        }
        
        let HWalls = Board::sort(walls1, W);
        let VWalls = Board::sort(walls2, H);
        
        Board { H, W, HWalls, VWalls }
    }
    
    fn sort(walls: HashMap<i32, Walls>, U: i32) -> HashMap<i32, Walls> {
        let mut sorted_walls = HashMap::<i32, Walls>::new();
        for (&y, wall) in &walls {
            let mut xs1 = wall.walls.iter().map(|&x| x).collect::<Vec::<i32>>();
            xs1.sort();
            xs1.insert(0, 0);
            xs1.push(U + 1);
            sorted_walls.insert(y, Walls { walls: xs1 });
        }
        sorted_walls
    }
}

fn f(H: i32, W: i32, pt0: Point, walls: Vec<Point>,
                                queries: Vec<(char, i32)>) {
    let board = Board::create(H, W, &walls);
    let mut pt = pt0;
    for query in queries.iter() {
        pt = board.walk(pt, query);
        println!("{} {}", pt.y, pt.x)
    }
}

fn main() {
    let v = read_input();
    f(v.0, v.1, v.2, v.3, v.4)
}

AtCoder Beginner Contest 274 D

https://atcoder.jp/contests/abc274/tasks/abc274_d

x軸とy軸で分けて考えればよいです。
あと、flattenがちゃんとあるんですね。

// Robot Arms 2
#![allow(non_snake_case)]

use std::collections::HashSet;

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()
}

fn YesNo(b: bool) -> String {
    return if b { "Yes".to_string() } else { "No".to_string() }
}

fn read_input() -> (i32, i32, Vec<i32>) {
    let v = read_vec();
    let x = v[1];
    let y = v[2];
    let A = read_vec();
    (x, y, A)
}

fn update(s: &HashSet<i32>, d: i32) -> HashSet<i32> {
    s.iter().map(|&n| vec![n-d, n+d]).flatten().collect::<HashSet<i32>>()
}

fn f(x: i32, y: i32, A: Vec<i32>) -> bool {
    let N = A.len();
    let mut sx = (A[0]..(A[0]+1)).collect::<HashSet<i32>>();
    let mut sy = (0..1).collect::<HashSet<i32>>();
    for i in (2..N).step_by(2) {
        sx = update(&sx, A[i]);
    }
    if !sx.contains(&x) {
        return false;
    }
    for i in (1..N).step_by(2) {
        sy = update(&sy, A[i]);
    }
    return sy.contains(&y)
}

fn main() {
    let v = read_input();
    println!("{}", YesNo(f(v.0, v.1, v.2)))
}