旋轉卡殼模板(poj2079)

//裸的旋轉卡殼 
#define N 50005
#define max(a,b) a>b?a:b
#include<iostream>
#include<algorithm>
using namespace std;

struct node
{
  int x,y;
}dd[N];
int n,stak[N],top,top1;
bool cmp(node a,node b)
{
    return a.x<b.x||(a.x==b.x&&a.y<b.y);
}
bool judge_right(int o,int a,int b)
{
    int ax=dd[a].x-dd[o].x;
    int bx=dd[b].x-dd[o].x;
    int ay=dd[a].y-dd[o].y;
    int by=dd[b].y-dd[o].y;
    return bx*ay>ax*by;
   // return (_int64)bx*ay>(_int64)ax*by;
}
double area(int o,int a,int b)
{
    int ax=dd[a].x-dd[o].x;
    int bx=dd[b].x-dd[o].x;
    int ay=dd[a].y-dd[o].y;
    int by=dd[b].y-dd[o].y;
    return abs(bx*ay-ax*by)*1.0/2.0;
}
void build_map()
{
    int i;
    top=0;
    sort(dd,dd+n,cmp);
    stak[top++]=0;
    stak[top++]=1;
    for( i=2;i<n;i++)
    {
        stak[top++]=i;
        while(top>=3)
        {
            if(judge_right(stak[top-3],stak[top-2],stak[top-1]))
            break;
            stak[top-2]=stak[top-1];
            top--;
        }
    }
    top1=top;
    stak[top++]=n-2;
    for(i=n-3;i>=0;i--)
    {
        stak[top++]=i;
        while(top-top1>=2)
        {
            if(judge_right(stak[top-3],stak[top-2],stak[top-1]))
            break;
            stak[top-2]=stak[top-1];
            top--;
        }
    }
    top--;
}


int main()
{
    int i,j,k;
    while(cin>>n&&n!=-1)
    {
            for(i=0;i<n;i++)
            cin>>dd[i].x>>dd[i].y;
            build_map();
            double ans=0;
            for(i=0;i<top;i++)
            {
                j=(i+1)%top;
                k=(j+1)%top;
                while(k!=i&&area(stak[i],stak[j],stak[k])<area(stak[i],stak[j],stak[(k+1)%top]))
                k=(k+1)%top;
                if(k==i) continue;
                int kk=(k+1)%top;
                while(j!=kk&&k!=i)
                {
                    ans=max(ans,area(stak[i],stak[j],stak[k]));
                    while(k!=i&&area(stak[i],stak[j],stak[k])<area(stak[i],stak[j],stak[(k+1)%top]))
                    k=(k+1)%top;
                    j=(j+1)%top;
                }
            }
        printf("%.2lf\n",ans);  
    }
return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章