hdu2297Run(凸包的巧妙应用)

链接

很巧妙的一道题,参考

把距离和速度分别作为x和y坐标,以斜率代表追赶速率,简直炫酷~

具体看上面的博客,画的很清楚,就不再抄写一遍了。

  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<stdlib.h>
  6 #include<vector>
  7 #include<cmath>
  8 #include<queue>
  9 #include<set>
 10 using namespace std;
 11 #define N 50010
 12 #define LL long long
 13 #define INF 0xfffffff
 14 const double eps = 1e-8;
 15 const double pi = acos(-1.0);
 16 const double inf = ~0u>>2;
 17 struct point
 18 {
 19     double x,y;
 20     point(double x=0,double y =0 ):x(x),y(y){}
 21 }p[N],ch[N];
 22 typedef point pointt;
 23 point operator -(point a,point b)
 24 {
 25     return point(a.x-b.x,a.y-b.y);
 26 }
 27 double cross(point a,point b)
 28 {
 29     return a.x*b.y-a.y*b.x;
 30 }
 31 int dcmp(double x)
 32 {
 33     if(fabs(x)<eps) return 0;
 34      else return x<0?-1:1;
 35 }
 36 double mul(point p0,point p1,point p2)
 37 {
 38     return cross(p1-p0,p2-p0);
 39 }
 40 double dis(point a)
 41 {
 42     return sqrt(a.x*1.0*a.x+a.y*1.0*a.y);
 43 }
 44 bool cmp(point a,point b)
 45 {
 46     if(dcmp(mul(p[0],a,b))==0)
 47         return dis(a-p[0])<dis(b-p[0]);
 48     else
 49         return dcmp(mul(p[0],a,b))>0;
 50 }
 51 int Graham(int n)
 52 {
 53     if(n<2) return n;
 54     int i,k = 0,top;
 55     point tmp;
 56     for(i = 0 ; i < n; i++)
 57     {
 58         if(p[i].y<p[k].y||(p[i].y==p[k].y&&p[i].x<p[k].x))
 59             k = i;
 60     }
 61     if(k!=0)
 62     {
 63         tmp = p[0];
 64         p[0] = p[k];
 65         p[k] = tmp;
 66     }
 67     sort(p+1,p+n,cmp);
 68     ch[0] = p[0];
 69     ch[1] = p[1];
 70     top = 1;
 71     for(i = 2; i < n ; i++)
 72     {
 73         while(top>0&&dcmp(mul(ch[top-1],ch[top],p[i]))<=0)
 74             top--;
 75         top++;
 76         ch[top] = p[i];
 77     }
 78     return top;
 79 }
 80 int main()
 81 {
 82     int t,i,n;
 83     cin>>t;
 84     while(t--)
 85     {
 86         scanf("%d",&n);
 87         for(i = 0 ; i < n; i++)
 88         scanf("%lf%lf",&p[i].y,&p[i].x);
 89         int m = Graham(n);
 90         int maxx = -INF,tx,maxy = -INF,ty;
 91         if(n<2)
 92         {
 93             cout<<"1
";
 94             continue;
 95         }
 96         for(i = 0 ; i <= m ; i++)
 97         {
 98             //cout<<ch[i].x<<" "<<ch[i].y<<endl;
 99             if(ch[i].x>maxx)
100             {
101                 tx = i;
102                 maxx = ch[i].x;
103             }
104             if(ch[i].y>maxy)
105             {
106                 ty = i;
107                 maxy = ch[i].y;
108             }
109         }
110         cout<<ty-tx+1<<endl;
111     }
112     return 0;
113 }
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3916971.html