CF498A题解

简单解析几何。

做这道题之前,你需要知道:

  1. 根据两点求直线一般式。

  2. 根据两条直线求交点坐标。

这里直接丢公式了,百度上也有证明过程,自己推导难度也不大。

  1. 若两点坐标为 (x1,y1),(x2,y2),则直线方程为:Ax+By+C=0,其中 A=y2y1,B=x1x2,C=x2y1x1y2

  2. 若两条直线方程为 A1 x+B1 y+C=0,A2 x+B2 y+C=0,若 A1B2=A2B1 则两直线平行,否则这两条直线有交点为 (C2B1C1B2A1B2A2B1,C1A2C2A1A1B2A2B1)

那直接暴力把每条直线的交点求出来,判断是否在 (x1,y1),(x2,y2) 所围成的矩形区域的范围内就可以了,要特判两条直线平行的情况,这里 (x1,y1),(x2,y2) 指的是学校和家两点的坐标。记得先判断 x1x2y1y2 之间的大小关系。

为了避免实数比大小,可以把交点的分母移到不等式另外一边,但是要注意分母正负对不等号方向的影响。

观察到坐标范围能到 106,如果两个坐标相乘可能能到达 1012,所以记得开 ll

#include<cstdio>
#define ll long long
ll x1,y1,x2,y2;
ll A,B,C;
int n,cnt;
ll a,b,c;
ll fm,x,y;
int main()
{
	scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2);
	A=y2-y1,B=x1-x2,C=x2*y1-x1*y2;
	if(x2<x1)
	{
		int t=x2;
		x2=x1;
		x1=t;
	}
	if(y2<y1)
	{
		int t=y2;
		y2=y1;
		y1=t;
	}
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld%lld%lld",&a,&b,&c);
		fm=A*b-a*B,x=c*B-C*b,y=C*a-c*A;
		if(fm==0) continue;
		if(fm>0&&x1*fm<=x&&x<=x2*fm&&y1*fm<=y&&y<=y2*fm) cnt++;
		if(fm<0&&x1*fm>=x&&x>=x2*fm&&y1*fm>=y&&y>=y2*fm) cnt++;
	}
	printf("%d",cnt);
	return 0;
}
posted @   osfly  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示