2019-2020 ICPC, Asia Jakarta Regional Contest C. Even Path(思维)

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

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.

题意:

给出一个行的权值Ai 列的权值Bj, 每个位的权值之和为Ai + Bj

多次询问, 每次给出x1,y1,x2,y2

问有没有那么一条路径从(x1, y1)到(x2, y2)且路径上的权值都为偶数

思路:

我们考虑先对每一个点的奇偶性处理,每一个点有一个行的奇偶性a[i], 列的奇偶性b[i]

然后对行列都做个前缀和

分情况讨论:

①若起点或者终点权值为奇数肯定输出NO

或者起点跟终点横纵的奇偶性不同, 例如起点权值(a[i] = 1, b[i] = 1), 终点(a[i] = 2, b[i] = 2)

奇数走到偶数后肯定是奇数, 那么肯定不行

②再考虑两种, 到目前起点肯定是(偶, 偶) 或者 (奇, 奇)

对于偶数如果向右或者向下移动,下一行或者下一列的属性一定是偶数

那么每次移动都要求是行列偶数, 一行都是偶数, 一列也都是偶数, 那么

区域内都是偶数,其实就是起点跟终点横纵坐标构成的区域,若满足条件可

以任意走, 我们只需要前缀和判一下x1 到 x2之间有没有奇数即可。

同理对于奇数, 我们只需要判断x1跟x2之间有没有偶数即可。

对于列也这样处理y1跟y2

#include <bits/stdc++.h>
#include <unordered_map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;

#ifdef LOCAL
#define debug(x) cout << "[" __FUNCTION__ ": " #x " = " << (x) << "]\n"
#define TIME cout << "RuningTime: " << clock() << "ms\n", 0
#else
#define TIME 0
#endif
#define hash_ 1000000009
#define Continue(x) { x; continue; }
#define Break(x) { x; break; }
const int mod = 1e9 + 7;
const int N = 2e5 + 100;
int r[N]; // 行
int c[N]; // 列
int a[N];
int b[N];
int main()
{
#ifdef LOCAL
	freopen("D:/input.txt", "r", stdin);
#endif
	int n, k;
	scanf("%d%d", &n, &k);
	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i]), a[i] &= 1, r[i] = r[i - 1] + a[i];
	for (int i = 1; i <= n; i++)
		scanf("%d", &b[i]), b[i] &= 1, c[i] = c[i - 1] + b[i]; 
	for (int i = 1; i <= k; i++)
	{
		int x1, y1, x2, y2;
		scanf("%d%d%d%d", &x1, &y1, &x2, &y2);  
		if ((a[x1] + b[y1]) % 2 || (a[x2] + b[y2]) % 2 || (a[x1] + b[y1]) != (a[x2] + b[y2]))
			puts("NO");
		else
		{
			if (x1 > x2)
				swap(x1, x2);
			if (y1 > y2)
				swap(y1, y2);      
			if (a[x1] && r[x2] - r[x1 - 1] != x2 - x1 + 1 || !a[x1] && r[x2] - r[x1 - 1] != 0)
				puts("NO");
			else
				if (b[y1] && c[y2] - c[y1 - 1] != y2 - y1 + 1 || !b[y2] && c[y2] - c[y1 - 1] != 0)
					puts("NO");
				else
					puts("YES");
		}
	}
	return TIME;
}

猜你喜欢

转载自blog.csdn.net/weixin_43731933/article/details/102771811