Anton and Lines(思维)
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.
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.
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).
4 1 2 1 2 1 0 0 1 0 2
NO
2 1 3 1 0 -1 3
YES
2 1 3 1 0 0 2
YES
2 1 3 1 0 0 3
NO
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\n",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"); } }