原题链接
AtCoder C. Convex Quadrilateral
分析
在一个多边形中,若 所有 对角线满足: 除对角线所连接的两点外 ,其余点都分布在该对角线的 两侧 (不存在所有点都位于对角线同侧),则该多边形为 凸多边形。
因此,我们已知所有点的坐标,即可用一次函数表示出对角线,带入其余点的坐标后就可以根据符号得出答案了。
参考代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int>PII;
const int N=3e5+10,M=N*2;
int x[N],y[N];
void solve(){
for(int i=1;i<=4;i++)cin>>x[i]>>y[i];
int A=y[3]-y[1],B=x[1]-x[3],C=x[3]*y[1]-x[1]*y[3];
int t1=A*x[2]+B*y[2]+C;
int t2=A*x[4]+B*y[4]+C;
if(t1*t2>0){
cout<<"No";
return;
}
A=y[4]-y[2],B=x[2]-x[4],C=x[4]*y[2]-x[2]*y[4];
t1=A*x[1]+B*y[1]+C;
t2=A*x[3]+B*y[3]+C;
if(t1*t2>0){
cout<<"No";
return;
}
cout<<"Yes";
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0);
int t=1;
while(t--)solve();
return 0;
}