首先,四边形的四个点肯定都在凸包上(别问我为什么我也不知道,感性理解一下好了)
那么我们可以求出凸包之后\(O(n^4)\)暴力枚举,据说在随机数据下凸包上的点只有\(O(logn)\)个可过
然而出题人大大的没有良心,上面那样写只有50分
我们考虑枚举对角线,那么剩下的两个点就是在这条对角线两边,也就是说要分别找到和这条边面积最大的点。发现这个可以用旋转卡壳来优化,计算面积用叉积,于是总的时间复杂度即为\(O(n^2)\)
//minamoto#include#define fp(i,a,b) for(register int i=a,I=b+1;i I;--i)using namespace std;//template inline bool cmax(T&a,const T&b){return a =0)--top; st[++top]=p[i]; } st[++top]=p[0]; if(top==4)return printf("%.3lf\n",(cross(st[0],st[1],st[2])+cross(st[2],st[3],st[0]))/2); fp(i,0,top)for(register int j=i+2,k=i+1,l=(i+3)%top;j