Code Forces 593 B. Anton and Lines(水~)

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;
}

你可能感兴趣的:(Code Forces 593 B. Anton and Lines(水~))