Module b

Expand description

ยงABC 376 B - Hands on Ring (Easy)

refs: https://atcoder.jp/contests/abc376/tasks/abc376_b

use proconio::input;

fn main() {
    input! {
        n: isize, q:usize,
        ops: [(char, isize); q],
    }

    let mut left = 1;
    let mut right = 2;
    let mut ans = 0;

    for (op, x) in ops {
        match op {
            'L' => {
                match (
                    clock_rotate(left, x, right, n),
                    rclock_rotate(left, x, right, n),
                ) {
                    (Some(rot), None) | (None, Some(rot)) => {
                        ans += rot;
                        left = x;
                    }
                    (Some(0), Some(0)) => { /* DO NOTHING */ }
                    _ => unreachable!(),
                }
            }
            'R' => {
                match (
                    clock_rotate(right, x, left, n),
                    rclock_rotate(right, x, left, n),
                ) {
                    (Some(rot), None) | (None, Some(rot)) => {
                        ans += rot;
                        right = x;
                    }
                    (Some(0), Some(0)) => { /* DO NOTHING */ }
                    _ => unreachable!(),
                }
            }
            _ => unreachable!(),
        }
    }

    println!("{ans}");
}

fn clock_rotate(start: isize, mut target: isize, mut pin: isize, n: isize) -> Option<usize> {
    if target < start {
        target += n;
    }
    if pin < start {
        pin += n;
    }
    if start < pin && pin < target {
        return None;
    }

    Some(target.abs_diff(start))
}

fn rclock_rotate(start: isize, mut target: isize, mut pin: isize, n: isize) -> Option<usize> {
    if target > start {
        target -= n;
    }
    if pin > start {
        pin -= n;
    }
    if target < pin && pin < start {
        return None;
    }

    Some(target.abs_diff(start))
}