下午一直在研究整体二分的思想但是由于智商原因至今未懂。。。
好吧从现在开始恶补计算几何。。。
以后注意poj上输出double要用.f而不是
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define MAX 50005
#define eps 1e-8
using namespace std;
struct wbysr
{
double x,y;
}a[MAX];
int n,stack_num=0;
double ans;
wbysr stack[MAX*2];
double dist(wbysr a1,wbysr a2)
{
return ((a1.x-a2.x)*(a1.x-a2.x)+(a1.y-a2.y)*(a1.y-a2.y));
}
double cross(wbysr a1,wbysr a2,wbysr a3)
{
return (a1.x-a3.x)*(a2.y-a3.y)-(a2.x-a3.x)*(a1.y-a3.y);
}
bool cmp(wbysr a1,wbysr a2)
{
return (a1.x<a2.x||(a1.x==a2.x&&a1.y<a2.y));
}
void work()
{
stack[stack_num+1]=stack[1];
int j=2,k;
/*for(int i=1;i<=stack_num;i++)
{
while(cross(stack[i+1],stack[j+1],stack[i])>cross(stack[i+1],stack[j],stack[i]))
j=(j+1)%stack_num+1;
for(int k=1;k<=stack_num;k++)
ans=max(ans,0.5*cross(stack[i],stack[j],stack[k])),printf("%.2lf\n",cross(stack[i],stack[j],stack[k]));
}
printf("%.2lf\n",ans);*/
for(int i=1;i<=stack_num;i++)
for(int j=k=(i)%stack_num+1;j!=i;j=j%stack_num+1)
{
while(cross(stack[i],stack[j],stack[k])<cross(stack[i],stack[j],stack[k+1]))
k=k%stack_num+1;
//printf("%d %d %d--------------------------------\n",i,j,k);
ans=max(ans,cross(stack[i],stack[j],stack[k]));
}
printf("%.2lf\n",ans/2);
}
int main()
{
while(scanf("%d",&n)&&n!=-1)
{
memset(stack,0,sizeof(stack));
stack_num=0;
for(int i=1;i<=n;i++)
scanf("%lf%lf",&a[i].x,&a[i].y);
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
{
while(stack_num>1&&cross(stack[stack_num],a[i],stack[stack_num-1])<=0)
stack_num--;
stack[++stack_num]=a[i];
}
int now=stack_num;
for(int i=n-1;i>=1;i--)
{
while(stack_num>now&&cross(stack[stack_num],a[i],stack[stack_num-1])<=0)
stack_num--;
stack[++stack_num]=a[i];
}
if(n>1)
stack_num--;
//for(int i=1;i<=stack_num;i++)
// printf("%.1lf %.1lf\n",stack[i].x,stack[i].y);
work();
}
return 0;
}
.lf