トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

ABC-086-C Traveling

■■■問題■■■

シカのAtCoDeerくんは二次元平面上で旅行をしようとしています。

AtCoDeerくんの旅行プランでは、
時刻0に点(0,0)を出発し、
1以上N以下の各iに対し、時刻tiに点(xi,yi)を訪れる予定です。

AtCoDeerくんが時刻tに点(x,y)にいる時、
時刻 t+1 には 点(x+1,y),(x-1,y),(x,y+1),(x,y-1)のうちいずれかに存在することができます。
その場にとどまることは出来ないことに注意してください。
AtCoDeerくんの旅行プランが実行可能かどうか判定してください。

■■■入力■■■

N
t1 x1 y1
t2 x2 y2
・
・
・
tN xN yN

●1 <= N <= 10万
●0 <= xi <= 10万
●0 <= yi <= 10万
●1 <= ti <= 10万
●ti < ti+1 (1 <= i <= N-1)
●入力は全て整数

■■■出力■■■

旅行プランが実行可能ならYesを、不可能ならNoを出力してください。


C#のソース

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static string InputPattern = "Input1";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("2");
            WillReturn.Add("3 1 2");
            WillReturn.Add("6 1 1");
            //Yes
            //例えば、(0,0),(0,1),(1,1),(1,2),(1,1),(1,0),(1,1)
            //と移動すればよいです。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("1");
            WillReturn.Add("2 100 100");
            //No
            //(0,0)にいる状態から2秒後に(100,100)にいるのは不可能です
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("2");
            WillReturn.Add("5 1 1");
            WillReturn.Add("100 1 1");
            //No
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();

        int[] wkArr = { };
        Action<string> SplitAct = pStr =>
            wkArr = pStr.Split(' ').Select(X => int.Parse(X)).ToArray();

        int PrevT = 0;
        int PrevX = 0, PrevY = 0;
        foreach (string EachStr in InputList.Skip(1)) {
            SplitAct(EachStr);
            int CurrT = wkArr[0];
            int CurrX = wkArr[1];
            int CurrY = wkArr[2];

            int DiffT = CurrT - PrevT;
            int DiffX = Math.Abs(CurrX - PrevX);
            int DiffY = Math.Abs(CurrY - PrevY);

            if (DiffT < DiffX + DiffY) {
                Console.WriteLine("No");
                return;
            }
            if ((DiffT - DiffX - DiffY) % 2 == 1) {
                Console.WriteLine("No");
                return;
            }
            PrevT = CurrT;
            PrevX = CurrX;
            PrevY = CurrY;
        }
        Console.WriteLine("Yes");
    }
}


解説

(時間の差 - 変位の差) が 0以上であり、偶数かを判定してます。