ABC086 C - Traveling

備忘録

問題

atcoder.jp

回答

"use strict"
function Main(input) {
  input = input.trim().split('\n');
  const N = Number(input[0].trim())
  const T = input.slice(-N);

  let ret = 'Yes';
  for(let i=0; i<N; i++){
    let arr = T[i].trim().split(' ').map(Number);
    let t = arr[0];
    let x = arr[1];
    let y = arr[2];
    
    if(t%2 !== 0 && (x+y)%2 === 0){
      ret = 'No';
    }

    if(t%2 === 0 && (x+y)%2 !== 0){
      ret = 'No';
    }

    if((x+y) > t){
      ret = 'No';
    }
  }

  console.log(ret);
}
Main(require("fs").readFileSync("/dev/stdin", "utf8"));

考え方

時刻が1増えるごとにxyが1増えるか、1減る。
そのため、旅行が成立する条件として下記の3つが存在する。

  • 時刻(t)が奇数の時、(x+y)は奇数であること
  • 時刻(t)が偶数の時、(x+y)は偶数であること
  • 座標(x, y)の合計値が時刻(t)を上回らないこと

以上の3条件をすべての座標で確認することが出来れば旅行成立。