「JEOI-R1」棋
题目背景
| 出题 | 标程 | 数据 | 验题 | 题解 |
| -----------: | -----------: | -----------: | -----------: | -----------: |
| [RedNebula](/user/478829) | [RedNebula](/user/478829) | [RedNebula](/user/478829) and [gyyyyx](/user/554574) | [gyyyyx](/user/554574) | [RedNebula](/user/478829) |
[RedNebula](/user/478829) 和 [_JF_](/user/361141) 在下一盘棋,然后……
题目描述
现在有一个 $n\times m$ 的棋盘,从上到下依次是 $1\sim n$ 行,从左到右依次是 $1\sim m$ 列,一个位于第 $x$ 行第 $y$ 列的位置被标记为 $(x,y)$。共有 $c$ 个棋子,**不重叠**地摆放在棋盘的某些位置上。一个位于 $(x,y)$ 的棋子可以走向 $(x-1,y-1),(x-1,y+1),(x+1,y-1),(x+1,y+1)$(如果这些位置**存在**且其上**没有棋子**)。
现有若干询问,每次询问给定 $x_1,y_1,x_2,y_2,p$,然后给定 $p$ 个位置,表示一个子矩阵的左上角位置为 $(x_1,y_1)$,右下角位置为 $(x_2,y_2)$,问是否可以移动棋子(无次数限制)使得矩阵内**有且仅有**给定的 $p$ 个位置上有棋子。**询问之间相互独立。**
为了减少程序时间复杂度的常数影响,**建议使用更快的读入方式。**
输入输出格式
输入格式
第一行三个正整数 $n,m,c$,表示棋盘的列数、行数和已有的棋子数。
接下来 $c$ 行,一行两个整数 $a_i,b_i$,表示有一个棋子位于 $a_i$ 行 $b_i$ 列处。
接下来一行一个正整数 $q$。
接下来 $q$ 组询问。每一组询问第一行是五个正整数 $x_1,y_1,x_2,y_2,p$,接下来 $p$ 行每行两个正整数 $c_i,d_i$,表示只希望矩阵内有棋子的位置。
输出格式
对于每个询问,如果可以移动棋子(无次数限制)使得矩阵内有且仅有给定的位置上有棋子,输出 `YES`,否则输出 `NO`。
输入输出样例
输入样例 #1
3 3 5
1 2
1 3
2 1
3 2
3 3
3
1 2 2 3 0
1 2 3 3 4
1 2
1 3
2 3
3 3
1 1 2 3 2
1 3
2 2
输出样例 #1
NO
YES
NO
说明
**【样例解释 \#1】**
解释以 `0` 代表空位,`1` 代表放置了棋子的位置。
初始状态:
```plain
011
100
011
```
对于第一个询问,可以证明 $(1,2)$ 处的棋子无法移出 $(1,2)$ 到 $(2,3)$ 的矩阵。
对于第二个询问,考虑把 $(3,2)$ 处的棋子移到 $(2,3)$,得:
```plain
011
101
001
```
满足询问要求。移动方式不唯一。
对于第三个询问,可以证明 $(2,1)$ 处的棋子无法移出 $(1,1)$ 到 $(2,3)$ 的矩阵。
**【数据范围】**
对于 $25\%$ 的数据,$n,m,q\le 10$,$c\le 20$。
对于另外 $25\%$ 的数据,保证 $a_i+b_i\equiv 0 \pmod 2$,$c_i+d_i\equiv 0 \pmod 2$。
对于另外 $25\%$ 的数据,保证 $n\cdot m-c\le(x_2-x_1+1)\cdot (y_2-y_1+1)-p$。
对于 $100\%$ 的数据,$2\le n,m\le 10^5$,$1\le c,q\le 10^5$,$c\le n\cdot m$,$1\le a_i\le n$,$1\le b_i\le m$,$\sum p\le 2\times 10^5$。对于每个询问,$1\le p\le (x_2-x_1+1)\cdot (y_2-y_1+1)$,$x_1\le c_i\le x_2$,$y_1\le d_i\le y_2$。
**【提示与说明】**
提供一种较快的读入一个 `int` 类型非负整数的方式。调用下文中的 `read()`,其作用是返回输入中的一个非负整数,同时读取其后的一个字符。
```cpp
int read() {
int x(0);
char c(getchar());
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
return x;
}
```