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 }
View Code

 

posted @ 2018-04-10 20:43  BadboyQAQ  阅读(165)  评论(0编辑  收藏  举报