#include<stdio.h>
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
#define eps 1e-8
int sig(double x){return (x>eps)-(x<-eps);}
struct P
{
double x,y;
P(double a=0,double b=0):x(a),y(b){}
P operator +(const P &a)const{
return P(x+a.x,y+a.y);
}
P operator -(const P &a)const{
return P(x-a.x,y-a.y);
}
P operator *(const double a)const{
return P(x*a,y*a);
}
P operator /(const double a)const{
return P(x/a,y/a);
}
double operator *(const P &a)const{
return (x*a.x+y*a.y);
}
double operator ^(const P &a)const{
return (x*a.y-y*a.x);
}
bool on(P a,P b)
{
P v1=a-*this,v2=b-*this;
return sig(v1^v2)==0&&sig(v1*v2)<=0;
}
};
struct Rec
{
P a,b,c,d;
double area;
};
int seg(P a1,P b1,P a2,P b2)
{
if(a1.on(a2,b2)||b1.on(a2,b2)||a2.on(a1,b1)||b2.on(a1,b1)) return 1;
return sig((b1-a1)^(b2-a1))*sig((b1-a1)^(a2-a1))<0&&sig((b2-a2)^(b1-a2))*sig((b2-a2)^(a1-a2))<0;
}
int cmp(P a,P b)
{
if(sig(a.x-b.x)!=0) return a.x<b.x;
else return a.y<b.y;
}
int cmp1(Rec a,Rec b)
{
return a.area>b.area;
}
int graphm(P *p,int n,P *q)
{
sort(p,p+n,cmp);
int m=0;
for(int i=0;i<n;i++)
{
while(m>1&&sig((q[m-1]-q[m-2])^(p[i]-q[m-2]))<=0) m--;
q[m++]=p[i];
}
int k=m;
for(int i=n-2;i>=0;i--)
{
while(m>k&&sig((q[m-1]-q[m-2])^(p[i]-q[m-2]))<=0) m--;
q[m++]=p[i];
}
if(n>1) m--;
if(m==4)
{
//cout<<"m="<<m<<endl;
//for(int i=0;i<m;i++) cout<<q[i].x<<" "<<q[i].y<<endl;
int flag=0;
for(int i=0;i<4;i++)
{
if(sig(q[i].x-q[i+1].x)==0||sig(q[i].y-q[i+1].y)==0) flag++;
}
if(flag==4) return 1;
}
return 0;
}
int Recjudge(Rec a,Rec b)
{
int flag=0;
P p[5],q[5];
p[0]=a.a;p[1]=a.b;p[2]=a.c;p[3]=a.d;p[4]=p[0];
q[0]=b.a;q[1]=b.b;q[2]=b.c;q[3]=b.d;q[4]=q[0];
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(seg(p[i],p[i+1],q[j],q[j+1])==1)
{flag=1;break;}
}
if(flag) break;
}
if(flag) return 0;
return 1;
}
int Recjudge1(P a,Rec b)
{
int flag=0;
P p[5];
p[0]=b.a;p[1]=b.b;p[2]=b.c;p[3]=b.d;p[4]=p[0];
for(int i=0;i<4;i++)
{
if(sig((p[i]-a)^(p[i+1]-a))>0) flag++;
}
if(flag==4) return 1;
else return 0;
}
Rec r[60060];
P p[40];
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
int cnt=0;
for(int i=0;i<n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
for(int k=j+1;k<n;k++)
{
for(int t=k+1;t<n;t++)
{
P ch1[6],ch2[6];
ch1[0]=p[i];ch1[1]=p[j];ch1[2]=p[k];ch1[3]=p[t];
if(graphm(ch1,4,ch2)==1)
{
r[cnt].a=ch2[0];r[cnt].b=ch2[1];r[cnt].c=ch2[2];r[cnt].d=ch2[3];
r[cnt].area=fabs((ch2[0]-ch2[1])^(ch2[2]-ch2[1]));
cout<<r[cnt].area<<endl;
cnt++;
}
}
}
}
}
cout<<"cnt="<<cnt<<endl;
sort(r,r+cnt,cmp1);
double ma=0;
for(int i=0;i<cnt;i++)
{
for(int j=i+1;j<cnt;j++)
{
if(Recjudge(r[i],r[j])==1)
{
int flag=0;
if(Recjudge1(r[i].a,r[j])==1)
{
flag=1;
}
if(Recjudge1(r[j].a,r[i])==1)
{
flag=1;
}
if(flag)
{
double area=max(r[i].area,r[j].area);
if(ma<area) ma=area;
}
else
{
ma=max(ma,r[i].area+r[j].area);
}
}
}
}
if(sig(ma)==0) printf("imp\n");
else printf("%.0lf\n",ma);
}
}
水题,可惜当时赛场上wa了无数发都没过,太伤心了,主要是当时思路很混乱,代码能力还是太弱啊,任取4点,枚举是否是平行于x轴的矩形,如果是,保留并算出面积
然后枚举矩形,如果不相交并且不包含,则求二者面积之和,如果包含,则算大矩形的面积,最后取最大值