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 yNOutput
If AtCoDeer can carry out his plan, print Yes; if he cannot, print No.
Example
Sample Input 1
2
3 1 2
6 1 1Sample 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 100Sample 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 1Sample 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;
}