给定一个n个点的严格凸多边形(各个内角<180°),现在要切出两个非退化三角形(三点不共线),要求两个三角形顶点必须是凸多边形的顶点,且三角形不可相交(但是点或边可以重合)。求两个三角形面积之差的最大值。
标签:div int eve bit 多边形 查询 like blog class
#include<bits/stdc++.h> typedef long long i64; struct pos{int x,y;}ps[10007]; pos operator+(pos a,pos b){return (pos){a.x+b.x,a.y+b.y};} pos operator-(pos a,pos b){return (pos){a.x-b.x,a.y-b.y};} i64 operator*(pos a,pos b){return i64(a.x)*b.y-i64(a.y)*b.x;} int n,ws[5007]; i64 ans=0,s0[5007],ms[5007]; void maxs(i64&a,i64 b){if(a<b)a=b;} int main(){ scanf("%d",&n); for(int i=1;i<=n;++i)scanf("%d%d",&ps[i].x,&ps[i].y); if((ps[2]-ps[1])*(ps[3]-ps[1])<0)std::reverse(ps+1,ps+n+1); ps[n*2+1]=ps[1]; ps[0]=ps[n]; for(int i=1;i<=n;++i)ps[n+i]=ps[i],ws[i]=i; for(int d=3;d<n;++d){ for(int l=1,r=d;l<=n;++l,++r){ pos a=ps[r]-ps[l]; s0[l]=(ps[ws[l]]-ps[l])*a; while(ws[l]+1<r){ i64 s1=(ps[ws[l]+1]-ps[l])*a; if(s1<s0[l])break; ++ws[l]; s0[l]=s1; } maxs(ms[l],s0[l]); } ms[n+1]=ms[1]; for(int l=1;l<=n;++l)maxs(ms[l],ms[l+1]); } for(int l=1,r=n-1;l<=n;++l,++r)maxs(ans,ms[l]-(ps[r]-ps[l])*(ps[r+1]-ps[l])); printf("%lld.%lld\n",ans/2,ans%2*5); return 0; }
bzoj4232: [Neerc2011 Northern]Kids Like Cakes
标签:div int eve bit 多边形 查询 like blog class
原文地址:http://www.cnblogs.com/ccz181078/p/7129145.html