题解:洛谷 AT_abc441_a Black Square
【题目来源】
洛谷:AT_abc441_a [ABC441A] Black Square - 洛谷
【题目描述】
有一个 \(10^{100}\) 行、 \(10^{100}\) 列的网格。
在下文中,从顶部起第 \(i\) 行、从左侧起第 \(j\) 列的单元格表示为单元格 \((i,j)\)。
在这个网格中,只有左上角为单元格 \((P,Q)\) 的 \(100\times100\) 的区域被涂成了黑色,所有其他单元格都被涂成了白色。
确定单元格 \((X,Y)\) 是否被涂成了黑色。
【输入】
输入以标准输入的形式给出,格式如下:
\(P\) \(Q\)
\(X\) \(Y\)
【输出】
如果单元格 \((X,Y)\) 被涂成了黑色,输出Yes;否则,输出No。
【输入样例】
3 3
5 10
【输出样例】
Yes
【核心思想】
-
问题分析:给定一个 \(10^{100} \times 10^{100}\) 的网格,只有左上角为 \((P, Q)\) 的 \(100 \times 100\) 区域被涂黑。判断单元格 \((X, Y)\) 是否在黑色区域内。这是一个矩形区域判定问题,核心在于判断点 \((X, Y)\) 是否落在矩形 \([P, P+99] \times [Q, Q+99]\) 内。
-
算法选择:
- 直接坐标比较:判断 \(X\) 是否在 \([P, P+99]\) 范围内且 \(Y\) 是否在 \([Q, Q+99]\) 范围内
-
关键步骤:
- 读入数据:\(P, Q, X, Y\)
- 矩形包含判定:
- 若 \(P \leq X \leq P + 99\) 且 \(Q \leq Y \leq Q + 99\),输出
Yes - 否则输出
No
- 若 \(P \leq X \leq P + 99\) 且 \(Q \leq Y \leq Q + 99\),输出
- 等价于:\(X \in [P, P+100-1]\) 且 \(Y \in [Q, Q+100-1]\)
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\)
- 空间复杂度:\(O(1)\)
-
矩形区域判定的核心思想:
- 坐标系的明确:题目中 \((i, j)\) 表示第 \(i\) 行第 \(j\) 列,\(P, Q\) 为黑色区域左上角。黑色区域覆盖行范围 \([P, P+99]\) 和列范围 \([Q, Q+99]\)(共 \(100\) 行 \(100\) 列)
- 边界包含性:\(100 \times 100\) 的区域从 \((P, Q)\) 开始,到 \((P+99, Q+99)\) 结束,因此右边界为 \(P+100-1\) 而非 \(P+100\)
- 大网格的无关性:\(10^{100}\) 的巨大尺寸只是背景,不影响判定逻辑,因为黑色区域固定为 \(100 \times 100\)
- 适用于基础坐标判定、矩形包含类入门问题
【算法标签】
入门 #模拟
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int p, q, x, y;
int main()
{
// 输入
cin >> p >> q >> x >> y;
// 检查点(x,y)是否在矩形内
if (x >= p && x <= p + 100 - 1 && y >= q && y <= q + 100 - 1)
cout << "Yes" << endl; // 点在矩形内
else
cout << "No" << endl; // 点在矩形外
return 0;
}
【运行结果】
3 3
5 10
Yes
浙公网安备 33010602011771号