ACM:几何思维
#pragma GCC optimize(3,"Ofast","inline")
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
#define int long long
#define ld long double
int flag;
#define pb(x) push_back(x);
vector<int>v[2],n,len;
void deal(vector<int>a,vector<int>b,int id){
int sz=a.size();//顶点数量
set<int>st;
for(int i=0;i<sz;i++)
//斜边
if(a[i]!=a[(i+1)%sz]&&b[i]!=b[(i+1)%sz]){
st.insert((i+1)%sz);
st.insert(i);
if(sz==4)//四边形的斜边腰长度
//斜边腰,必与坐标轴平行
len.pb(abs(a[(i+2)%4]-a[(i+3)%4])+abs(b[(i+2)%4]-b[(i+3)%4]));
}
if(st.size()==0) {//是矩形
v[id].pb(abs(a[2]-a[0]));//高
v[id].pb(abs(b[2]-b[0]));//长
flag++;
}else{
for(int i : st){//斜边的点
v[id].pb(a[i]);
v[id].pb(b[i]);
}
}
}
bool zhen(){
//属于两个多边形的顶点个数
if(n[0]<6&&n[1]<6&&n[0]+n[1]<9) {
if(flag==2){//两个矩形
int a=v[0][0],b=v[0][1];
int c=v[1][0],d=v[1][1];
if(a==c||a==d||b==c||b==d){
//两个矩形可以合成一个矩形
return 1;
}
}else if(flag==0){
if(v[0].size()==4&&v[1].size()==4){
//都有一个斜边
if(n[0]==4&&n[1]==4&&len[0]!=len[1])
//都是四边形,但是斜边腰不相等
return 0;
//特判直角腰,斜边的dx轴,dy轴是否相等
int a=abs(v[0][2]-v[0][0]),b=abs(v[0][3]-v[0][1]); if(a>b) swap(a,b);
int c=abs(v[1][2]-v[1][0]),d=abs(v[1][3]-v[1][1]); if(c>d) swap(c,d);
if(a==c&&b==d) {return 1;}
}
}
}
return 0;
}
void solve()
{
flag=0,n.clear(),len.clear();
for(int i=0;i<2;i++){
v[i].clear();
int k;cin>>k;
n.pb(k);
vector<int>a(k),b(k);
for(int i=0;i<k;i++)
cin>>a[i]>>b[i];
deal(a,b,i);
}
if(zhen()) {cout<<"YES\n";}
else cout<<"NO\n";
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t;cin>>t;
while(t--)
solve();
return 0;
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ~!