hdu 3934 Summer holiday(凸包最大内接三角形)

求n个点能组成的最大三角形,一发旋转卡壳模板题。。。

 

    #include<algorithm>

    #include<iostream>

    #include<cstring>

    #include<cstdlib>

    #include<fstream>

    #include<sstream>

    #include<vector>

    #include<string>

    #include<cstdio>

    #include<bitset>

    #include<stack>

    #include<queue>

    #include<cmath>

    #include<map>

    #include<set>

    #define FF(i, a, b) for(int i=a; i<b; i++)

    #define FD(i, a, b) for(int i=a; i>=b; i--)

    #define REP(i, n) for(int i=0; i<n; i++)

    #define CLR(a, b) memset(a, b, sizeof(a))

    #define PB push_back

    #define LL long long

    #define eps 1e-10

    #define debug puts("**debug**")

    using namespace std;



    struct Point

    {

        double x, y;

        Point(double x=0, double y=0) : x(x), y(y) {}

    };

    typedef Point Vector;



    Vector operator + (Vector a, Vector b) { return Vector(a.x+b.x, a.y+b.y) ; }

    Vector operator - (Point a, Point b)   { return Vector(a.x-b.x, a.y-b.y); }

    Vector operator * (Vector a, double p) { return Vector(a.x*p, a.y*p); }

    Vector operator / (Vector a, double p) { return Vector(a.x/p, a.y/p); }



    bool operator < (const Point& a, const Point& b)

    {

        return a.x < b.x || (a.x == b.x && a.y < b.y);

    }



    int dcmp(double x)

    {

        if(fabs(x) < eps) return 0; return x < 0 ? -1 : 1;

    }

    bool operator == (const Point& a, const Point& b)

    {

        return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y) == 0;

    }

    double Cross(Vector a, Vector b) { return a.x*b.y - a.y*b.x; }

    double Dot(Vector a, Vector b) { return a.x*b.x + a.y*b.y ;}

    double Length(Vector a) { return sqrt(Dot(a, a)); }



    int ConvexHull(Point* p, int n, Point* ch)

    {

        sort(p, p+n);

        int m = 0;

        REP(i, n)

        {

            while(m > 1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <=0) m--;

            ch[m++] = p[i];

        }

        int k = m;

        FD(i, n-2, 0)

        {

            while(m > k && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) m--;

            ch[m++] = p[i];

        }

        if(n > 1) m--;

        return m;

    }



    double RC_Distance(Point* ch, int n)  //凸包直径

    {

        int q = 1;

        double ans = 0;

        ch[n] = ch[0];

        REP(p, n)

        {

            while(Cross(ch[q+1]-ch[p+1], ch[p]-ch[p+1]) > Cross(ch[q]-ch[p+1], ch[p]-ch[p+1])) q = (q+1)%n;

            ans = max(ans, max(Length(ch[p]-ch[q]), Length(ch[p+1]-ch[q+1])));

        }

        return ans;

    }



    double RC_Triangle(Point* res,int n)// 凸包最大内接三角形

    {

         if(n<3)    return 0;

         double ans=0, tmp;

         res[n] = res[0];

         int j, k;

         REP(i, n)

         {

             j = (i+1)%n;

             k = (j+1)%n;

             while((j != k) && (k != i))

             {

                  while(Cross(res[j] - res[i], res[k+1] - res[i]) > Cross(res[j] - res[i], res[k] - res[i])) k= (k+1)%n;

                  tmp = Cross(res[j] - res[i], res[k] - res[i]);if(tmp > ans) ans = tmp;

                  j = (j+1)%n;

             }

         }

         return ans;

    }



    Point read_point()

    {

        Point a;

        scanf("%lf%lf", &a.x, &a.y);

        return a;

    }



    const int maxn = 1000010;

    int n;

    double x, y, w;

    Point p[maxn], ch[maxn];



    int main()

    {

        while(~scanf("%d", &n))

        {

            REP(i, n) p[i] = read_point();

            int m = ConvexHull(p, n, ch);

            double ans = RC_Triangle(ch, m);

            printf("%.2f\n", ans/2);

        }

        return 0;

    }


 

 

你可能感兴趣的:(HDU)