2019-2020 ICPC, Asia Jakarta Regional Contest C. Even Path

Pathfinding is a task of finding a route between two points. It often appears in many problems. For example, in a GPS navigation software where a driver can query for a suggested route, or in a robot motion planning where it should find a valid sequence of movements to do some tasks, or in a simple maze solver where it should find a valid path from one point to another point. This problem is related to solving a maze.

The maze considered in this problem is in the form of a matrix of integers AA of N×NN×N. The value of each cell is generated from a given array RR and CC of NN integers each. Specifically, the value on the ithith row and jthjth column, cell (i,j)(i,j), is equal to Ri+CjRi+Cj. Note that all indexes in this problem are from 11 to NN.

A path in this maze is defined as a sequence of cells (r1,c1),(r2,c2),…,(rk,ck)(r1,c1),(r2,c2),…,(rk,ck) such that |ri−ri+1|+|ci−ci+1|=1|ri−ri+1|+|ci−ci+1|=1 for all 1≤i<k1≤i<k. In other words, each adjacent cell differs only by 11 row or only by 11 column. An even path in this maze is defined as a path in which all the cells in the path contain only even numbers.

Given a tuple ⟨ra,ca,rb,cb⟩⟨ra,ca,rb,cb⟩ as a query, your task is to determine whether there exists an even path from cell (ra,ca)(ra,ca) to cell (rb,cb)(rb,cb). To simplify the problem, it is guaranteed that both cell (ra,ca)(ra,ca) and cell (rb,cb)(rb,cb) contain even numbers.

For example, let N=5N=5, R={6,2,7,8,3}R={6,2,7,8,3}, and C={3,4,8,5,1}C={3,4,8,5,1}. The following figure depicts the matrix AA of 5×55×5 which is generated from the given array RR and CC.

Let us consider several queries:

⟨2,2,1,3⟩⟨2,2,1,3⟩: There is an even path from cell (2,2)(2,2) to cell (1,3)(1,3), e.g., (2,2),(2,3),(1,3)(2,2),(2,3),(1,3). Of course, (2,2),(1,2),(1,3)(2,2),(1,2),(1,3) is also a valid even path.
⟨4,2,4,3⟩⟨4,2,4,3⟩: There is an even path from cell (4,2)(4,2) to cell (4,3)(4,3), namely (4,2),(4,3)(4,2),(4,3).
⟨5,1,3,4⟩⟨5,1,3,4⟩: There is no even path from cell (5,1)(5,1) to cell (3,4)(3,4). Observe that the only two neighboring cells of (5,1)(5,1) are cell (5,2)(5,2) and cell (4,1)(4,1), and both of them contain odd numbers (7 and 11, respectively), thus, there cannot be any even path originating from cell (5,1)(5,1).
Input

Input begins with a line containing two integers: NN QQ (2≤N≤1000002≤N≤100000; 1≤Q≤1000001≤Q≤100000) representing the size of the maze and the number of queries, respectively. The next line contains NN integers: RiRi (0≤Ri≤1060≤Ri≤106) representing the array RR. The next line contains NN integers: CiCi (0≤Ci≤1060≤Ci≤106) representing the array CC. The next QQ lines each contains four integers: rara caca rbrb cbcb (1≤ra,ca,rb,cb≤N1≤ra,ca,rb,cb≤N) representing a query of ⟨ra,ca,rb,cb⟩⟨ra,ca,rb,cb⟩. It is guaranteed that (ra,ca)(ra,ca) and (rb,cb)(rb,cb) are two different cells in the maze and both of them contain even numbers.

Output

For each query in the same order as input, output in a line a string "YES" (without quotes) or "NO" (without quotes) whether there exists an even path from cell (ra,ca)(ra,ca) to cell (rb,cb)(rb,cb).

Examples

input

Copy

5 3
6 2 7 8 3
3 4 8 5 1
2 2 1 3
4 2 4 3
5 1 3 4
output

Copy

YES
YES
NO
input

Copy

3 2
30 40 49
15 20 25
2 2 3 3
1 2 2 2
output

Copy

NO
YES
Note

Explanation for the sample input/output #1

This is the example from the problem description.

解题思路:题目要求起点到终点的经过的每一个点的权值都为偶数,偶数的组合:奇+奇=偶、偶+偶=偶,利用数组row[]、col[],假设row[i]=x,表示从x开始到i的奇偶性相同,col[]同理,那实际上两个数组的值会组成一块区域,看终点是否存在这一个区域里面,需要保证的是起点的x、y都大于终点的x、y,如果起点的x、y都小于终点的x、y,那么起点可以说是终点,终点可以说是起点,如果起点只有x或y小于终点的x或y,相当于两个对称的点。

AC代码:

#include <iostream>
#include <cstdio>
#define N 100005
 
using namespace std;
 
int R[N],C[N];
int col[N],row[N]; 
int main() {
    int n, q;
    cin >> n >> q;
    for (int i = 1; i <= n; i++)
        scanf("%d", &R[i]);
    for (int i = 1; i <= n; i++)
        scanf("%d", &C[i]);
    row[1] = col[1] = 1;
    for (int i = 2; i <= n; i++) {
        if (R[i]%2 == R[i-1]%2)
            row[i] = row[i - 1]; 
        else
            row[i] = i;
        if (C[i]%2 == C[i-1]%2)
            col[i] = col[i - 1];
        else
            col[i] = i;
    }
    while (q--) {
        int ra, ca, rb, cb;
        scanf("%d%d%d%d", &ra, &ca, &rb, &cb); 
        if(ra<rb)
            swap(ra,rb);
        if(ca<cb)
            swap(ca,cb);
            if (row[ra] <= rb && col[ca] <= cb)
                puts("YES");
            else
                puts("NO");    
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/lovelcy/p/11824591.html