[Gym-101512C] 凸包+最远点对
2017-09-29 17:34
381 查看
找最大的四边形或者三角形面积,先求凸包,然后枚举两个点,再通过旋转,找最大的另两个点
View Code
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pii pair<int,int> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-7; const int N=1000+10,maxn=60000+10,inf=0x3f3f3f; void debug(){cout<<-1<<endl;} struct point{ ll x,y; }; point p ,s ; int top,n; ll dir(point p1,point p2,point p3) { return (p3.x-p1.x)*(p2.y-p1.y)-(p3.y-p1.y)*(p2.x-p1.x); } ll dis(point a,point b) { return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); } ll area(point p1,point p2,point p3) { return fabs(dir(p1,p2,p3)); } bool comp(point a,point b) { ll te=dir(p[0],a,b); if(te<0)return 1; if(te==0&&dis(p[0],a)<dis(p[0],b))return 1; return 0; } void graham() { int pos,minx,miny; minx=miny=inf; for(int i=0;i<n;i++) { if(p[i].x<minx||(p[i].x==minx&&p[i].y<miny)) { minx=p[i].x; miny=p[i].y; pos=i; } } swap(p[0],p[pos]); sort(p+1,p+n,comp); p =p[0]; s[0]=p[0],s[1]=p[1],s[2]=p[2]; top=2; for(int i=3;i<=n;i++) { while(dir(s[top-1],s[top],p[i])>=0&&top>=2)top--; s[++top]=p[i]; } //cout<<top<<endl; if(top==3) { cout<<area(s[0],s[1],s[2])/2; if(area(s[0],s[1],s[2])&1)cout<<".5"; cout<<endl; return ; } else if(top<3) { cout<<0<<endl; return ; } /* for(int i=0;i<top;i++) cout<<s[i].x<<" "<<s[i].y<<endl;*/ ll ans=0; for(int i=0;i<top;i++) { int j,a1=(i+1)%top,a2=(i+3)%top; for(j=(i+2)%top;j!=i;j=(j+1)%top) { while(a1!=j&&area(s[(a1+1)%top],s[i],s[j])>=area(s[a1],s[i],s[j]))a1=(a1+1)%top; while(a2!=i&&area(s[(a2+1)%top],s[i],s[j])>=area(s[a2],s[i],s[j]))a2=(a2+1)%top; ans=max(ans,area(s[a1],s[i],s[j])+area(s[a2],s[i],s[j])); } } cout<<ans/2; if(ans&1)cout<<".5"; cout<<endl; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout<<setiosflags(ios::fixed)<<setprecision(1); int t; cin>>t; while(t--) { cin>>n; for(int i=0;i<n;i++)cin>>p[i].x>>p[i].y; graham(); } return 0; } /******************** 3 6 0 0 3 7 10 0 11 6 0 10 10 10 5 0 0 -2 -2 3 -2 0 1 0 3 10 3 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4 ********************/
View Code
相关文章推荐
- Gym 101164.H - Pub crawl (凸包)
- Codeforces Gym 100286A. Aerodynamics 计算几何 求二维凸包面积
- Gym 100883J palprime(二分判断点在凸包里)
- Codeforces Gym 101164 H. Pub crawl (凸包)
- 【凸包】【三分】Gym - 101309D - Dome of Circus
- 【计算几何】【凸包】Gym - 101164H - Pub crawl
- Gym 101308A Asteroids 三维凸包 求重心
- 【计算几何】【凸包】【极角排序】【二分】Gym - 101128J - Saint John Festival
- Gym 100883J palprime(二分判断点在凸包里)
- Gym - 101673:B Craters (几何,求凸包)
- Gym 101243.I - Land Division Gym - 101243I(计算几何 切割凸包)
- I - Land Division Gym - 101243I 计算几何 切割凸包
- gym 101164 H.Pub crawl 凸包
- GYM 101128 J.Saint John Festival(凸包-Graham扫描法+二分)
- 求凸包及其面积
- Gym - 100851F Froggy Ford
- UVA 681 Convex Hull Finding【逆时针输出凸包顶点】
- Gym 100962G Green Day (K个生成树构造1个完全图 -- 找规律)
- 凸包。
- hdu 5695 Gym Class