Traveling(AtCoder-3875)

Problem Description

AtCoDeer the deer is going on a trip in a two-dimensional plane. In his plan, he will depart from point (0,0) at time 0, then for each i between 1 and N (inclusive), he will visit point (xi,yi) at time ti.

If AtCoDeer is at point (x,y) at time t, he can be at one of the following points at time t+1: (x+1,y), (x−1,y), (x,y+1) and (x,y−1). Note that he cannot stay at his place. Determine whether he can carry out his plan.

Constraints

  • 1 ≤ N ≤ 105
  • 0 ≤ xi ≤ 105
  • 0 ≤ yi ≤ 105
  • 1 ≤ ti ≤ 105
  • ti < ti+1 (1 ≤ i ≤ N−1)
  • All input values are integers.

Input

Input is given from Standard Input in the following format:

N
t1 x1 y1
t2 x2 y2
:
tN xN yN

Output

If AtCoDeer can carry out his plan, print Yes; if he cannot, print No.

Example

Sample Input 1

2
3 1 2
6 1 1

Sample Output 1

Yes
For example, he can travel as follows: (0,0), (0,1), (1,1), (1,2), (1,1), (1,0), then (1,1).

Sample Input 2

1
2 100 100

Sample Output 2

No
It is impossible to be at (100,100) two seconds after being at (0,0).

Sample Input 3

2
5 1 1
100 1 1

Sample Output 3

No

题意:有一个人初始时在原点 (0,0) 且时间为 0,现在要顺序去往 n 个点,每个点给出要到达的时间 t 和坐标 (x,y),每次可以向上下左右四个方向行走,且时间+1,问能否在给定的时间下到达所有点

思路:

首先,从原点开始计算与下一个点的距离,如果这个距离大于要到的点的时间 t,那么一定不能按时到达

其次,在时间达到要求的情况下,即 t>=dis 时,考虑是否能按时到达:

  • 若两点距离为奇数,那么就要求 t 必须为奇数,这样当时间 t 大于距离 dis 时,可以重复在两点间不断行走,直到到达时间 t
  • 若两点距离为偶数,那么就要求 t 必须为偶数,这样当时间 t 大于距离 dis 时,可以重复在两点间不断行走,直到到达时间 t

Source Program

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 100000+5;
const int dx[] = {-1,1,0,0,-1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;
int main(){

    int n;
    scanf("%d",&n);

    bool flag=true;
    int x=0,y=0;
    for(int i=1;i<=n;i++){
        int t,nx,ny;
        scanf("%d%d%d",&t,&nx,&ny);
        int dis=abs(nx-x)+abs(ny-y);
        nx=x,ny=y;
        if(dis>t)
            flag=false;
        else{
            if(dis%2==0 && t%2!=0)
                flag=false;
            else if(dis%2==1 && t%2!=1)
                flag=false;
        }
    }

    if(flag)
        printf("Yes\n");
    else
        printf("No\n");

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值