这个题我改了好久呢。(最终居然是挂在常识上,我的算法完全没写错)
算是计算几何的第一步啦 这个题很容易想到四边形的四个点在凸包上,但是暴力枚举复杂度依然感人 可以考虑先枚举对角线,那么另外两个点就满足单峰,可以用三分优化,据说这样写卡卡常能过 然后发现枚举对角线的过程中,另外两个点也是跟着在动的,维护一下就好了 时间复杂度\(O(n^2)\) 代码:(懒得判叉积方向了,直接用fabs,反正是面积,符号不影响)#include#include #include #include using namespace std;#define rg registerconst int maxn=2010;int n,top,top1;double ans;struct oo{double x,y;}a[maxn],st[maxn],stt[maxn];double operator*(oo a,oo b){return a.x*b.y-a.y*b.x;}oo operator-(oo a,oo b){return (oo){b.x-a.x,b.y-a.y};}bool cmp(oo a,oo b){return a.x =0)top1--; stt[++top1]=a[i]; } for(rg int i=top1-1;i>=2;i--)st[++top]=stt[i];st[top+1]=st[1]; for(rg int i=1;i<=top;i++) { int a=i%top+1,b=(i+2)%top+1; for(rg int j=i+2;j<=top;j++) { while(a%top+1!=j&&fabs((st[a+1]-st[i])*(st[a+1]-st[j]))>fabs((st[a]-st[i])*(st[a]-st[j])))a=a%top+1; while(b%top+1!=i&&fabs((st[b+1]-st[i])*(st[b+1]-st[j]))>fabs((st[b]-st[i])*(st[b]-st[j])))b=b%top+1; ans=max(ans,fabs((st[a]-st[j])*(st[a]-st[i]))+fabs((st[b]-st[i])*(st[b]-st[j]))); } } printf("%.3lf",ans/2.0);}