zoukankan      html  css  js  c++  java
  • POJ1228:Grandpa's Estate——题解

    http://poj.org/problem?id=1228

    题目大意:给一个凸包,问是否为稳定凸包。

    ————————————————————————

    稳定凸包的概念为:我任意添加一个点都不能使这个凸包得到扩充,这样的凸包为稳定凸包。

    我们求完凸包后枚举边然后枚举有多少点在上面即可。

    (网上的程序真的大部分是错的……)

    #include<cstdio>
    #include<queue>
    #include<cctype>
    #include<cstring>
    #include<stack>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int N=1001;
    struct point{
        int x;
        int y;
    }p[N],q[N];
    int n,per[N],l;
    inline point getmag(point a,point b){
        point s;
        s.x=b.x-a.x;s.y=b.y-a.y;
        return s;
    }
    inline int multiX(point a,point b){
        return a.x*b.y-b.x*a.y;
    }
    inline int dis(point a,point b){
        return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
    }
    inline bool cmp(int u,int v){
        int det=multiX(getmag(p[1],p[u]),getmag(p[1],p[v]));
        if(det!=0)return det>0;
        return dis(p[1],p[u])<dis(p[1],p[v]);
    }
    void graham(){
        int id=1;
        for(int i=2;i<=n;i++){
        if(p[i].x<p[id].x||(p[i].x==p[id].x&&p[i].y<p[id].y))id=i;
        }
        if(id!=1)swap(p[1],p[id]);
        for(int i=1;i<=n;i++)per[i]=i;
        sort(per+2,per+n+1,cmp);
        l=0;
        q[++l]=p[1];
        for(int i=2;i<=n;i++){
        int j=per[i];
        while(l>=2&&multiX(getmag(q[l-1],p[j]),getmag(q[l-1],q[l]))>=0){
            l--;
        }
        q[++l]=p[j];
        }
        return;
    }
    bool judge(){
        for(int i=1;i<=l;i++){
        int sum=0;
        for(int j=1;j<=n;j++){
            if(multiX(getmag(q[i],p[j]),getmag(p[j],q[i%l+1]))==0)sum++;
        }
        if(sum<3)return 0;
        }
        bool flag=0;
        for(int i=2;i<=l&&!flag;i++){
        if(multiX(getmag(q[i-1],q[i]),getmag(q[i],q[i%l+1]))!=0)flag=1;
        }
        return flag;
    }
    int main(){
        int t;
        scanf("%d",&t);
        while(t--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d%d",&p[i].x,&p[i].y);
        graham();
        if(judge())puts("YES");
        else puts("NO");
        }
        return 0;
    }
  • 相关阅读:
    wenbao与powershell
    wenbao与windows
    wenbao与msf
    CCF201612-Python题解
    语不惊人死不休
    为人性僻耽佳句(一)
    Pytorch出现 raise NotImplementedError
    CNN卷积
    python字符串切片
    python----numpy(持续更新)
  • 原文地址:https://www.cnblogs.com/luyouqi233/p/8097506.html
Copyright © 2011-2022 走看看