凸包+三分哪崩了???

P4166 [SCOI2007] 最大土地面积

这三分有点。。。。。
by ezoixx130 @ 2018-12-19 19:12:55


@[ezoixx130](/space/show?uid=34886) 我知道我三分挫了
by ezoiHY @ 2018-12-20 12:48:45


```cpp #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const double eps=1e-8; int n,top,tmp=1; double ans; struct node{ double x,y,att; bool operator < (const node &b) const { return fabs(att-b.att)<eps?(att>(atan(-1)/2.0)?x<b.x:x>b.x):att<b.att; } }s[100001],p[100001]; double cp(node a1,node a2,node b1,node b2){ return (a2.x-a1.x)*(b2.y-b1.y)-(a2.y-a1.y)*(b2.x-b1.x); } double dis(node p1,node p2){ return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); } double dis2(double A,double B,double C,double x0,double y0){ // printf("%lf %lf %lf %lf %lf %lf\n",A,B,C,x0,y0,abs((A*x0+B*y0+C)/sqrt(A*A+B*B))); return abs((A*x0+B*y0+C)/sqrt(A*A+B*B)); } int main(){ // freopen("data.in","r",stdin); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lf%lf",&p[i].x,&p[i].y); if(p[i].y<p[tmp].y or (p[i].y==p[tmp].y and p[i].x<p[tmp].x)){ tmp=i; } } swap(p[1],p[tmp]); for(int i=2;i<=n;i++){ p[i].att=atan2(p[i].x-p[1].x,p[i].y-p[1].y); } sort(p+2,p+n+1); // for(int i=1;i<=n;i++){ // printf("%lf %lf\n",p[i].x,p[i].y); // } s[++top]=p[1]; for(int i=2;i<=n;i++){ while(top>1 and cp(s[top-1],s[top],s[top],p[i])>0){ top--; } s[++top]=p[i]; } if(top==3){ printf("0"); return 0; } for(int i=1;i<=top;i++){ for(int j=i+2;abs(i-j)>=2;j++,j%=top){ j%=top; if(j==0)j=top; double k=(s[i].y-s[j].y)/(s[i].x-s[j].x),b=s[i].y-k*s[i].x; double d=dis(s[i],s[j]); double cmps=0; int l,r; if(i<j){ l=i+1,r=j-1; while(r-l>2){ int midl=(l*2+r)/3,midr=(l+r*2)/3; double tmpl=dis2(k,-1,b,s[midl].x,s[midl].y); double tmpr=dis2(k,-1,b,s[midr].x,s[midr].y); if(tmpl>tmpr){ r=midr; }else { l=midl; } } double a=dis2(k,-1,b,s[l].x,s[l].y); double bb=dis2(k,-1,b,s[r].x,s[r].y); double cc=dis2(k,-1,b,s[(r+l)>>1].x,s[(r+l)>>1].y); cmps+=d*max(a,max(bb,cc)); l=i-1,r=(j+1)%top; int aa=0; if(l==0)l=top; if(r==0)r=top; // if(!(l==1 or r==1 or l==top or r==top)){ if(r==0)r=top; r-=l; aa=l; l=top; r=(r+top)%top; if(r==0)r=top; // } while(r-l>2){ int midl=(l*2+r)/3,midr=(l+r*2)/3; double tmpl=dis2(k,-1,b,s[(midl+aa)%top!=0?(midl+aa)%top:top].x,s[(midl+aa)%top!=0?(midl+aa)%top:top].y); double tmpr=dis2(k,-1,b,s[(midr+aa)%top!=0?(midr+aa)%top:top].x,s[(midr+aa)%top!=0?(midr+aa)%top:top].y); if(tmpl>tmpr){ r=midr; }else { l=midl; } } int mid=(((l+r)>>1)+aa)%top; if(mid==0)mid=top; l=(l+aa)%top!=0?(l+aa)%top:top; r=(r+aa)%top!=0?(r+aa)%top:top; a=dis2(k,-1,b,s[l].x,s[l].y); bb=dis2(k,-1,b,s[r].x,s[r].y); cc=dis2(k,-1,b,s[mid].x,s[mid].y); cmps+=d*max(a,max(bb,cc)); }else { l=i-1,r=j+1; while(r-l>2){ int midl=(l*2+r)/3,midr=(l+r*2)/3; double tmpl=dis2(k,-1,b,s[midl].x,s[midl].y); double tmpr=dis2(k,-1,b,s[midr].x,s[midr].y); if(tmpl>tmpr){ r=midr; }else { l=midl; } } double a=dis2(k,-1,b,s[l].x,s[l].y); double bb=dis2(k,-1,b,s[r].x,s[r].y); double cc=dis2(k,-1,b,s[(r+l)>>1].x,s[(r+l)>>1].y); cmps+=d*max(a,max(bb,cc)); l=(i+1)%top,r=j-1; int aa=0; if(l==0)l=top; if(r==0)r=top; // if(!(l==1 or r==1 or l==top or r==top)){ if(l==0)l=top; l-=r; aa=r; r=top; l=(l+top)%top; if(l==0)l=top; // } while(r-l>2){ int midl=(l*2+r)/3,midr=(l+r*2)/3; double tmpl=dis2(k,-1,b,s[(midl+aa)%top!=0?(midl+aa)%top:top].x,s[(midl+aa)%top!=0?(midl+aa)%top:top].y); double tmpr=dis2(k,-1,b,s[(midr+aa)%top!=0?(midr+aa)%top:top].x,s[(midr+aa)%top!=0?(midr+aa)%top:top].y); if(tmpl>tmpr){ r=midr; }else { l=midl; } } int mid=(((l+r)>>1)+aa)%top; if(mid==0)mid=top; l=(l+aa)%top!=0?(l+aa)%top:top; r=(r+aa)%top!=0?(r+aa)%top:top; a=dis2(k,-1,b,s[l].x,s[l].y); bb=dis2(k,-1,b,s[r].x,s[r].y); cc=dis2(k,-1,b,s[mid].x,s[mid].y); cmps+=d*max(a,max(bb,cc)); } ans=max(ans,cmps); } } // printf("%d\n",top); printf("%.3lf",ans/2); return 0; } ```
by ezoiHY @ 2018-12-20 12:50:25


%旋转卡壳用三分
by zzw4257 @ 2019-01-06 20:27:29


|