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 3934 Summer holiday(凸包最大内接三角形))