Description
给出n条直线的斜率与截距并给出一区间(l,r),问这n条直线是否会在这个区间中相交
Input
第一行为一整数n表示直线条数,第二行两个整数l和r表示区间左右端点,之后n行每行两个整数ki和bi表示该条直线的斜率与截距 (2 ≤ n ≤ 100 000,-1000000<=l,r,ki,bi<=1000000)
Output
如果这n条直线在(l,r)内无交点则输出NO,否则输出YES
Sample Input
4
1 2
1 2
1 0
0 1
0 2
Sample Output
NO
Solution
求出每条直线与区间的两个交点Li和Ri,然后对(Li,Ri)升序排序,之后判断L和R是否都递增(非严格)即可
Code
#include<stdio.h>
#include<stdlib.h>
#define maxn 111111
typedef long long ll;
struct node
{
ll l,r;
}p[maxn];
int cmp(const void *a,const void *b)
{
node c=*(node*)a,d=*(node*)b;
if(c.l!=d.l)return c.l>d.l?1:-1;
return c.r>d.r?1:-1;
}
int main()
{
int n;
ll L,R,k,b;
while(~scanf("%d",&n))
{
scanf("%I64d%I64d",&L,&R);
for(int i=0;i<n;i++)
{
scanf("%I64d%I64d",&k,&b);
p[i].l=L*k+b;
p[i].r=R*k+b;
}
qsort(p,n,sizeof(p[0]),cmp);
int flag=1;
for(int i=0;i<n-1;i++)
if(p[i].l<=p[i+1].l&&p[i].r<=p[i+1].r)
continue;
else
{
flag=0;
break;
}
if(!flag)printf("YES\n");
else printf("NO\n");
}
return 0;
}