题意:二维平面上有n个不同的点(x,y),问是否能画两条直线 使得所有点都至少在其中一条直线上.
n<=1e5, -1e9<=x,y<=1e9.
先找到三个不共线的点a,b,c 因为只能画两条直线,所以a,b,c三点间必须画一条直线.三种情况(a,b),(a,c),(b,c)
n<=1e5, -1e9<=x,y<=1e9.
先找到三个不共线的点a,b,c 因为只能画两条直线,所以a,b,c三点间必须画一条直线.三种情况(a,b),(a,c),(b,c)
画完这条线(a,b)以后,判断剩下的点是否在(a,b) 或者在(c,i)上即可.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
ll n,x[N],y[N],p3=-1;
bool flag=false;
void check(int a,int b,int c)
{
int d=-1,cnt=0;
for(int i=3;i<=n;i++)
{
if(i==p3) continue;
if((y[i]-y[a])*(x[b]-x[a])==(y[b]-y[a])*(x[i]-x[a]))
cnt++;
else
{
if(d==-1)
d=i,cnt++;
else if((y[i]-y[c])*(x[d]-x[c])==(y[d]-y[c])*(x[i]-x[c]))
cnt++;
}
}
//cout<<cnt<<'\n';
flag|=(cnt==n-3);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++