• Anton and Lines(思维)


    Anton and Lines
    time limit per test
    1 second
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    The teacher gave Anton a large geometry homework, but he didn't do it (as usual) as he participated in a regular round on Codeforces. In the task he was given a set of n lines defined by the equations y = ki·x + bi. It was necessary to determine whether there is at least one point of intersection of two of these lines, that lays strictly inside the strip between x1 < x2. In other words, is it true that there are 1 ≤ i < j ≤ n and x', y', such that:

    • y' = ki * x' + bi, that is, point (x', y') belongs to the line number i;
    • y' = kj * x' + bj, that is, point (x', y') belongs to the line number j;
    • x1 < x' < x2, that is, point (x', y') lies inside the strip bounded by x1 < x2.

    You can't leave Anton in trouble, can you? Write a program that solves the given task.

    Input

    The first line of the input contains an integer n (2 ≤ n ≤ 100 000) — the number of lines in the task given to Anton. The second line contains integers x1 and x2 ( - 1 000 000 ≤ x1 < x2 ≤ 1 000 000) defining the strip inside which you need to find a point of intersection of at least two lines.

    The following n lines contain integers ki, bi ( - 1 000 000 ≤ ki, bi ≤ 1 000 000) — the descriptions of the lines. It is guaranteed that all lines are pairwise distinct, that is, for any two i ≠ j it is true that either ki ≠ kj, or bi ≠ bj.

    Output

    Print "Yes" (without quotes), if there is at least one intersection of two distinct lines, located strictly inside the strip. Otherwise print "No" (without quotes).

    Examples
    input
    4 1 2 1 2 1 0 0 1 0 2
    output
    NO
    input
    2 1 3 1 0 -1 3
    output
    YES
    input
    2 1 3 1 0 0 2
    output
    YES
    input
    2 1 3 1 0 0 3
    output
    NO
    Note

    In the first sample there are intersections located on the border of the strip, but there are no intersections located strictly inside it.

    题解:如果两个直线在x1--x2间有交点,必然对于直线A的y1,y2,包含直线B的y1,y2;只要知道这就可以了,求出每个点的y1,y2排序判断就好:

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int INF=0x3f3f3f3f;
    #define mem(x,y) memset(x,y,sizeof(x))
    #define SI(x) scanf("%d",&x)
    #define PI(x) printf("%d",x)
    #define P_ printf(" ")
    typedef __int64 LL;
    const int MAXN=100100;
    struct Node{
        LL l,r;
        bool operator < (const Node b) const{
            if(l!=b.l)return l<b.l;
            else return r<b.r;
        }
    };
    Node dt[MAXN];
    int main(){
        int N,x1,x2;
        LL k,b;
        while(~scanf("%d",&N)){
            scanf("%d%d",&x1,&x2);
            for(int i=0;i<N;i++){
                scanf("%I64d%I64d",&k,&b);
                dt[i].l=k*x1+b;dt[i].r=k*x2+b;
            }
            sort(dt,dt+N);
            int flot=0,k=0;
            for(int i=0;i<N;i++){
                if(dt[i].l>dt[k].l&&dt[i].r<dt[k].r)flot=1;
                while(dt[i].r>dt[k].r)k++;
            }
            if(flot)puts("YES");
            else puts("NO");
        }
        return 0;
    }

    暴力必然超时:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int INF=0x3f3f3f3f;
    #define mem(x,y) memset(x,y,sizeof(x))
    #define SI(x) scanf("%d",&x)
    #define PI(x) printf("%d",x)
    #define P_ printf(" ")
    typedef __int64 LL;
    double x1,x2;
    const int MAXN=100010;
    struct Node{
        int k,b;
    };
    Node dt[MAXN];
    bool js(Node x,Node y){
        if(x.k==y.k)return false;
        double temp=1.0*(y.b-x.b)/(x.k-y.k);
    //    printf("%lf
    ",temp);
        if(temp>x1&&temp<x2)return true;
        else return false;
    }
    int main(){
        int n;
        while(~scanf("%d",&n)){
            scanf("%lf%lf",&x1,&x2);
            for(int i=0;i<n;i++){
                scanf("%d%d",&dt[i].k,&dt[i].b);
            }
            int flot=0;
    
            for(int i=0;i<n;i++){
                if(flot)break;
                for(int j=i+1;j<n;j++){
                    if(js(dt[i],dt[j]))flot=1;
                    if(flot)break;
                }
            }
            if(flot)puts("YES");
            else puts("NO");
        }
    }
  • 相关阅读:
    ajax原理和XmlHttpRequest对象
    在vue项目中 如何定义全局变量 全局函数
    杂乱知识 -- 记录工作或学习中遇到的一些点
    JavaScript中的数组遍历forEach()与map()方法以及兼容写法
    cookie的存取删
    微信小程序中公用内容
    mysql 多实例
    yum 安装和卸载
    rpm 安装卸载
    git blame
  • 原文地址:https://www.cnblogs.com/handsomecui/p/5253910.html
Copyright © 2020-2023  润新知