目录
一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
A - Two Squares |
二、解题报告
1、思路分析
由于数据量很小,可以暴力判断一个正方形的每个点是否在另一个正方形内
数据量大的话,可以套用计算几何中 判断线段相交 的方式
由于本题是正方形,只不过第二个正方形旋转了45°,那么我们可以考虑更简单的做法(因为判断线段相交也是有一些corner case的)
对于(x, y) ,顺时针旋转45°后为((x + y) / sqrt(2), (x - y) / sqrt(2))
然后判断square1 每个点是否在square2 中(二者需要旋转)
然后判断square2 每个点是否在square1 中(二者不需要旋转)
但这样并非是充分的,下面这个特判跟前段时间力扣逆天3100分计算几何题类似
我们判断下square1 的中心是否在square2中,比如下面这个情况
证明充分性其实也好证明,因为一个是正方形,一个是旋转45°正方形,如果二者相交且没有任何一个正方形的一个点被另一个包含,我们无法构造出中心不被包含的情况的
2、复杂度
时间复杂度: O(1)空间复杂度:O(1)
3、代码详解
#include <bits/stdc++.h>
using i64 = long long;
using i32 = unsigned int;
using u64 = unsigned long long;
using i128 = __int128;
constexpr int inf32 = 1E9 + 7;
constexpr i64 inf64 = 1E18 + 7;
void solve() {
std::array<int, 8> s1, s2;
// U D L R
std::array<int, 4> dir1, dir2;
dir1[0] = dir2[0] = -inf32, dir1[1] = dir2[1] = inf32,
dir1[2] = dir2[2] = inf32, dir1[3] = dir2[3] = -inf32;
for (int i = 0; i < 4; ++ i) {
std::cin >> s1[i * 2] >> s1[i * 2 + 1];
dir1[0] = std::max(dir1[0], s1[i * 2 + 1]);
dir1[1] = std::min(dir1[1], s1[i * 2 + 1]);
dir1[2] = std::min(dir1[2], s1[i * 2]);
dir1[3] = std::max(dir1[3], s1[i * 2]);
}
for (int i = 0; i < 4; ++ i) {
std::cin >> s2[i * 2] >> s2[i * 2 + 1];
dir2[0] = std::max(dir2[0], s2[i * 2] - s2[i * 2 + 1]);
dir2[1] = std::min(dir2[1], s2[i * 2] - s2[i * 2 + 1]);
dir2[2] = std::min(dir2[2], s2[i * 2] + s2[i * 2 + 1]);
dir2[3] = std::max(dir2[3], s2[i * 2] + s2[i * 2 + 1]);
}
for (int i = 0; i < 4; ++ i) {
int x = s1[i * 2], y = s1[i * 2 + 1];
if (x + y >= dir2[2] && x + y <= dir2[3] && x - y <= dir2[0] && x - y >= dir2[1]) {
std::cout << "YES\n";
return;
}
x = s2[i * 2], y = s2[i * 2 + 1];
if (x >= dir1[2] && x <= dir1[3] && y <= dir1[0] && y >= dir1[1]) {
std::cout << "YES\n";
return;
}
}
int x = 0, y = 0;
for (int i = 0; i < 4; ++ i) {
x += s1[i * 2], y += s1[i * 2 + 1];
}
x /= 4, y /= 4;
if (x + y >= dir2[2] && x + y <= dir2[3] && x - y <= dir2[0] && x - y >= dir2[1]) {
std::cout << "YES\n";
return;
}
x = 0, y = 0;
for (int i = 0; i < 4; ++ i) {
x += s2[i * 2], y += s2[i * 2 + 1];
}
std::cout << "NO\n";
}
auto FIO = []{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
return 0;
}();
int main () {
#ifdef DEBUG
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int T = 1;
// std::cin >> T;
while (T --)
solve();
return 0;
}