2019-2020 ICPC, Asia Jakarta Regional Contest C. Even Path
Posted lovelcy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
以上是关于2019-2020 ICPC, Asia Jakarta Regional Contest C. Even Path的主要内容,如果未能解决你的问题,请参考以下文章
2019-2020 ICPC, Asia Jakarta Regional Contest H. Twin Buildings
比赛:ICPC Asia Taipei-Hsinchu Regional 2019 2020.4.1
2019-2020 ICPC Asia Taipei-Hsinchu Regional Contest 训练记录
2019-2020 ICPC, Asia Jakarta Regional Contest.E. Songwriter
2019-2020 ICPC, Asia Jakarta Regional Contest K题 Addition Robot线段树维护矩阵积