codeforces 961D Pair Of Lines
题目链接:http://codeforces.com/contest/961/problem/D
题意:给你n个二维坐标点,xi,yi的绝对值在1e9以内,然后问你能不能用两条直线穿过所有点。可以输出YES,不可以输出NO。
分析:当n<=4时,我们知道肯定是输出YES的。当n>4时,如果一条之间可以直接穿过所有点,那么就直接输出YES,否则选不共线的三个点,可以确定三条直线。比如选取1,2,3三个点,那么我们以1和2确定一条直线,判断这个n个点,如果有某个点不在这条直线上,我们就让他和3重新构成一条直线。如果这两条直线能穿过所有点,那么久输出YES,如果没能穿过所有点,我们就枚举剩下的情况,分别以1,3和2,3来当初始确定的直线。如果这三种情况都不可以,那么就输出NO。判断点在直线上应该比较简单,这里就不细说了。
AC代码:
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 struct st{ 6 long long x,y; 7 }a[100005]; 8 int n; 9 int judge(int c1,int c2,int c3){ 10 long long x1=a[c2].x-a[c1].x; 11 long long y1=a[c2].y-a[c1].y; 12 long long x2=0; 13 long long y2=0; 14 long long d=__gcd(x1,y1); 15 x1/=d; 16 y1/=d; 17 if(x1<0){ 18 x1*=-1; 19 y1*=-1; 20 } 21 int ans1=0,ans2=0; 22 for(int i=1;i<=n;i++){ 23 if(i!=c1&&i!=c2&&i!=c3){ 24 long long x3=a[i].x-a[c1].x; 25 long long y3=a[i].y-a[c1].y; 26 long long x4,y4; 27 if(x2!=0||y2!=0){ 28 x4=a[i].x-a[c3].x; 29 y4=a[i].y-a[c3].y; 30 d=__gcd(x4,y4); 31 x4/=d; 32 y4/=d; 33 if(x4<0){ 34 x4*=-1; 35 y4*=-1; 36 } 37 } 38 d=__gcd(x3,y3); 39 x3/=d; 40 y3/=d; 41 if(x3<0){ 42 x3*=-1; 43 y3*=-1; 44 } 45 //cout<<i<<endl; 46 // cout<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<" "<<x3<<" "<<y3<<" "<<x4<<" "<<y4<<endl; 47 if(x3==x1&&y3==y1){ 48 ans1++; 49 } 50 else if(x2==0&&y2==0){ 51 x2=a[i].x-a[c3].x; 52 y2=a[i].y-a[c3].y; 53 d=__gcd(x2,y2); 54 x2/=d; 55 y2/=d; 56 if(x2<0){ 57 x2*=-1; 58 y2*=-1; 59 } 60 } 61 else if(x4==x2&&y4==y2){ 62 ans2++; 63 } 64 else return 0; 65 } 66 } 67 return n; 68 } 69 int main(){ 70 ios_base::sync_with_stdio(0); 71 cin.tie(0); 72 cin>>n; 73 for(int i=1;i<=n;i++){ 74 cin>>a[i].x>>a[i].y; 75 } 76 if(n<=4){ 77 cout<<"YES"<<endl; 78 return 0; 79 } 80 long long x1,y1,d,ans=-1; 81 x1=a[2].x-a[1].x; 82 y1=a[2].y-a[1].y; 83 d=__gcd(x1,y1); 84 x1/=d; 85 y1/=d; 86 if(x1<0){ 87 x1*=-1; 88 y1*=-1; 89 } 90 for(int i=3;i<=n;i++){ 91 long long x2=a[i].x-a[1].x; 92 long long y2=a[i].y-a[1].y; 93 d=__gcd(x2,y2); 94 x2/=d; 95 y2/=d; 96 if(x2<0){ 97 x2*=-1; 98 y2*=-1; 99 } 100 if(x2!=x1||y1!=y2){ 101 ans=i; 102 break; 103 } 104 } 105 if(ans==-1){ 106 cout<<"YES"<<endl; 107 return 0; 108 } 109 d=-1; 110 d=judge(1,2,ans); 111 if(d==n){ 112 cout<<"YES"<<endl; 113 return 0; 114 } 115 d=judge(2,ans,1); 116 if(d==n){ 117 cout<<"YES"<<endl; 118 return 0; 119 } 120 d=judge(1,ans,2); 121 if(d==n){ 122 cout<<"YES"<<endl; 123 return 0; 124 } 125 cout<<"NO"<<endl; 126 return 0; 127 }