D. Pair Of Lines(思维+模拟)

题目

题意:

    给定n个点,输出是否这些点可以至多用两条直线就可以连接。
     1   ≤   n   ≤   1 0 5 , ∣ x i ∣ ,   ∣ y i ∣   ≤   1 0 9 1 ≤ n ≤ 10^5,|x_i|, |y_i| ≤ 10^9 1n105,xi,yi109

分析:

    由于一共只有两条线,而且两点确定一条直线。假设答案存在,那么随便拿出三个点,必然有一条直线穿过某两个点。一共三种情况将第一条直线确定下来。
    对于别的点来说,如果这个点不在这条直线上,那么必然形成新的直线,再度模拟一下即可。对于一条直线,我们只需要维护在他上面的两个点即可。判断是否在直线上直接判斜率是否相等。

#include <iostream>
#include <cstring> 
using namespace std;

typedef long long ll;

struct point{
	ll x,y;
}p[100005];

int vis[100005];
ll x1,y1,x2,y2,x3,y3,x4,y4;
int flag3,flag4;
int n;

bool slove(int a1,int a2)
{
	x1 = p[a1].x,y1 = p[a1].y;
	x2 = p[a2].x,y2 = p[a2].y;
	flag3 = flag4 = 0;
	memset(vis,0,sizeof(vis));
	vis[a1] = vis[a2] = 1;
	for (int i = 1; i <= n; i++)
	{
		if( vis[i] ) continue;
		if( (p[i].y - y1 ) * (x2 - x1) == ( p[i].x - x1) * (y2-y1) ) continue;
		else if( flag3 == 0 ) x3 = p[i].x,y3 = p[i].y,flag3 = 1;
		else if( flag4 == 0 ) x4 = p[i].x,y4 = p[i].y,flag4 = 1;
		else if( ( p[i].y - y3 ) * ( x4 - x3 ) == ( p[i].x - x3 ) * ( y4 - y3 ) ) continue;
		else return false;
	}
	return true;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> p[i].x >> p[i].y;
	}
	if( n <= 3 )
	{
		cout << "YES" << '\n';
		return 0;
	}
	if( slove(1,2) || slove(1,3) || slove(2,3) ) cout << "YES" << '\n';
	else cout << "NO" << '\n';
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值