首页 > 其他分享 >CF498A题解

CF498A题解

时间:2023-08-25 21:24:25浏览次数:39  
标签:直线 x1 题解 ll CF498A x2 y1 y2

简单解析几何。

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

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

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

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

  1. 若两点坐标为 \((x_1,y_1),(x_2,y_2)\),则直线方程为:\(Ax+By+C=0\),其中 \(A=y_2-y_1,B=x_1-x_2,C=x_2y_1-x_1y_2\)。

  2. 若两条直线方程为 \(A_1\ x+B_1\ y+C=0,A_2\ x+B_2\ y+C=0\),若 \(A_1B_2=A_2B_1\) 则两直线平行,否则这两条直线有交点为 \(\Large (\frac{C_2B_1-C_1B_2}{A_1B_2-A_2B_1},\frac{C_1A_2-C_2A_1}{A_1B_2-A_2B_1})\)。

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

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

观察到坐标范围能到 \(10^6\),如果两个坐标相乘可能能到达 \(10^{12}\),所以记得开 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;
}

标签:直线,x1,题解,ll,CF498A,x2,y1,y2
From: https://www.cnblogs.com/osfly/p/17657988.html

相关文章

  • UVA10192题解
    为了尽可能满足父母亲的要求,我们应该取两个字符串的最长公共子序列。洛谷模板题设\(dp_{i,j}\)为\(a\)串匹配到第\(i\)位,\(b\)串匹配到第\(j\)位时的最长公共子序列长度。则易知\(dp_{i,j}\)可以由\(dp_{i-1,j}\)和\(dp_{i,j-1}\)转移过来。如果\(a_{i}=b_{j}......
  • CF1673A的题解
    好久没做CF的水题了由于每一个人都以最佳策略进行游戏且Alice先手。设字符串长度为\(|s|\)。我们可以考虑:\(|s|\)为偶数,此时Alice可以直接全部取走,不给Bob任何机会(人心险恶啊)。\(|s|\)为奇数,此时Alice最多取\(|s|-1\)个字符,也就剩下头和尾。对比头和尾,哪一个大就......
  • CF1674C的题解
    有意思的题目。还是比较好想的。先考虑-1的情况,可以想到,如果\(t\)的长度不为\(1\),并且\(t\)里面还有a的话,那么这个新的a又能被下一个\(t\)替换,无限套娃。剩下的,还是有两种情况:如果\(t\)只有一个字符a,那么\(s\)无论怎么被替换都是一样的(全部都是a),所以,这......
  • CF1674B的题解
    很简单的题可以先初始化一下,把所有单词放进一个map里,最后输入时用map映射即可。一个坑点,注意每一个单词的两个字母不相同。#include<cstdio>#include<map>#include<string>#include<iostream>usingnamespacestd;map<string,int>mp;voidinit(){ intindex=0;......
  • CF1311F的题解
    前置芝士:二维偏序。二维偏序的板子题。怎么看出是二维偏序的呢?考虑点对\((i,j)\),令\(x_i<x_j\)。若\(v_i>v_j\),则两点会越来越近,易知最短距离为\(0\),所以我们不需要考虑这种情况。所以问题转化成:\(x_i<x_j\)且\(v_i\lev_j\)的点对的距离和。很明显,二维偏序,套板子就......
  • CF1701B的题解
    简单构造题。很明显的,当\(d=2\)的时候代价最大。证明:\(\becausep_i\cdotd=p_{i+1}\)当\(d\)减小时,\(p_i\cdotd\)也在减小,\(p_{i+1}\)也在减小,那么\(p_{i+1}\)减小时,\(p_{i+1}\)可供选择的数就越多,代价也随即越大,那么\(d\)在取最小值时,代价最大,因为\(p\)是......
  • CF131D的题解
    注意到\(n\)实在是小到不行,我们可以直接采用比较暴力的做法。(嗯,可能算比较暴力吧很简单,找环,然后把环里的所有点全部压进dijkstra的优先队列就行了。找环最坏\(n\)遍跑满的dfs,最短路是\(O(n\logn)\)的,最坏时间复杂度为\(O(n^2)\),稳过。什么?怎么找环?都2202年了不会还......
  • CF605B的题解
    算是对Leap_Frog大佬的补充吧qwq。%%%Leap_Frog.我们来看一下大佬的这段话:考虑倒着思考Kruskal算法。按边权从小到大排序。每次插入一条边。如果是树边,那就新开节点。否则在当前节点内任意连边。这样构造,每次非树边插入都比当前两端小。所以必然正确。对于“如果是......
  • P3847的题解
    典型到不能再典型的区间dp了。观察四种操作,考虑到加一个数和删一个数的情况相同,所以无非就是:删一个数。改一个数。设\(dp[l][r]\)为让区间\(l\simr\)对称(变成回文串)的最少次数。可以很快地得出状态转移方程:情况\(1\):如果\(a_l=a_r\),则\(dp[l][r]=dp[l+1][r-......
  • CF1712A的题解
    挺简单的一道题。要想使\(\sum\limits^k_{i=1}p_i\)最小,很明显的,前\(k\)个数必须为\(1\simk\)。设\(c_i\)为\(i\)在\(p\)里出现的位置,则答案为\(\sum\limits^{k}_{i=1}[c_i>k]\)。#include<cstdio>intt;intn,k;inta[110],c[110];intans;intmain(){ sca......