zoukankan      html  css  js  c++  java
  • UVALive 4728 Squares

    https://vjudge.net/problem/UVALive-4728

    题意 :

    给出n个正方形,求所有的正方形顶点中的最远距离

    求凸包直径,旋转卡壳

    开始狂WA原因:

    返回凸包中点的个数时,返回的m

    凸包中点实际为[0,m-2],

    m-1位置(上凸壳加进去的)与0位置(下凸壳加进去的)相同

    在旋转卡壳时,q的取值范围为[0,m-1]

    但会用到m,此时的m位置不是凸包中的点

    所以令m-1

    凸包中点实际为[0,m-1]

    m位置(上凸壳加进去的)与0位置(下凸壳加进去的)相同

    在旋转卡壳时,q取值范围[0,m-1]

    q最大用到m,m位置仍是凸包中的点

    #include<cmath>
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    
    #define N 400001
    
    using namespace std;
    
    struct Point
    {
        int x,y;
        
        Point (int x=0,int y=0):x(x),y(y) { }
    
        bool operator < (Point p) const
        {
            if(x!=p.x) return x<p.x;
            return y<p.y;
        }
        
        bool operator == (Point p) const
        {
            return x==p.x && y==p.y;
        }
    };
    
    typedef Point Vector;
    
    Point P[N],ch[N];
    
    Vector operator - (Vector A,Vector B) { return Vector(A.x-B.x,A.y-B.y); }
    
    void read(int &x)
    {
        x=0; char c=getchar();
        while(!isdigit(c)) c=getchar();
        while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }
    }
    
    int Cross(Vector A,Vector B)
    {
        return A.x*B.y-A.y*B.x;
    }
    
    int ConvexHull(Point *p,int n,Point *c)
    {
        sort(p,p+n);
        n=unique(p,p+n)-p;
        int m=0;
        for(int i=0;i<n;++i)
        {
            while(m>1 && Cross(c[m-1]-c[m-2],p[i]-c[m-2])<=0) m--;
            c[m++]=p[i];
        }
        int k=m;
        for(int i=n-2;i>=0;--i)
        {
            while(m>k && Cross(c[m-1]-c[m-2],p[i]-c[m-2])<=0) m--;
            c[m++]=p[i];
        }
        if(n>1) m--;
        return m;
    }
    
    int getdis(Point A,Point B)
    {
        return (A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y);
    }
    
    int RotatingCaliper(Point *c,int m)
    {
        int q=1;
        int ans=0;
        for(int p=0;p<m;++p)
        {
            while(abs(Cross(c[p]-c[p+1],c[q+1]-c[p+1]))>abs(Cross(c[p]-c[p+1],c[q]-c[p+1]))) q=(q+1)%m;
            ans=max(ans,max(getdis(c[p],c[q]),getdis(c[p+1],c[q+1])));
            ans=max(ans,max(getdis(c[p+1],c[q]),getdis(c[p],c[q+1])));
        }
        return ans;
    }
    
    int main()
    {
        int T,n,m;
        int cnt,x,y,w;
        read(T);
        while(T--)
        {
            read(n);
            cnt=0;
            for(int i=1;i<=n;++i)
            {
                read(x); read(y); read(w);
                P[cnt].x=x; P[cnt++].y=y;
                P[cnt].x=x+w; P[cnt++].y=y;
                P[cnt].x=x; P[cnt++].y=y+w;
                P[cnt].x=x+w; P[cnt++].y=y+w;
            }
            m=ConvexHull(P,cnt,ch);
            printf("%d
    ",RotatingCaliper(ch,m));
        }
    }
  • 相关阅读:
    linux下sar指令查看系统活动报告
    视频卡顿网络侧问题处理----2019-5-17
    mysql中的group by
    多个条件组合的测试用例该如何决策
    对多条件进行组合,生成笛卡尔积的用例集合的python代码实现
    音视频测试相关文档集合
    类型转换
    基本类型:实型(浮点型)
    有符号数和无符号数
    基本类型:整型与字符型
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/8252841.html
Copyright © 2011-2022 走看看