uvalive6859 凸包
2017-07-27 13:54
597 查看
/**这个题是在网格上找能围住所有的点的几何体周长,比较容易能想到 凸包几何体显然是由点周围的点组成的,所以把每个点的上下左右都加入 点集,然后再求一个凸包。由于两点之间不能直接相连,所有的点只能 由网格的边长和对角线相连, 所以再求d1=list[stack[i]].x-list[stace[i+1]].x 和d2=list[stack[i]].y-list[stack[i+1]].y sum1=min(d1,d2)的和 sum2=d2-d1的和 最后的结果就是sum=根2*sum1+sum2,关于这个公示可以通过画图来推得 还有值得注意的一点,这题得用double,用longlong可能会因为超精度 而被判wa。**/ #include<stdio.h> #include<math.h> #include<algorithm> #include<iostream> using namespace std; const int MAXN=1000005; const double PI=acos(-1.0); struct point { double x,y; }; point list[MAXN]; int stack[MAXN],top; double cross(point p0,point p1,point p2) { return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x); } double dis(point p1,point p2) { return sqrt((double)(p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)); } bool cmp(point p1,point p2) { double tmp=cross(list[0],p1,p2); if(tmp>0) return true; else if(tmp==0&&dis(list[0],p1)<dis(list[0],p2)) return true; else return false; } void graham(int n) { int i; if(n==1) {top=0;stack[0]=0;} if(n==2) { top=1; stack[0]=0; stack[1]=1; } if(n>2) { for(i=0;i<=1;i++) stack[i]=i; top=1; for(i=2;i<n;i++) { while(top>0&&cross(list[stack[top-1]],list[stack[top]],list[i])<=0) top--; top++; stack[top]=i; } } } int main() { int n; while(scanf("%d",&n)!=-1) { int cnt=0; for(int i=0;i<n;i++) { double xx,yy; scanf("%lf%lf",&xx,&yy); list[cnt].x=xx+1;list[cnt++].y=yy; list[cnt].x=xx-1;list[cnt++].y=yy; list[cnt].x=xx;list[cnt++].y=yy+1; list[cnt].x=xx;list[cnt++].y=yy-1; } point p0=list[0]; int k=0; for(int i=1;i<cnt;i++) { if(list[i].y<p0.y||(list[i].y==p0.y&&list[i].x<p0.x)) { p0=list[i]; k=i; } } list[k]=list[0]; list[0]=p0; sort(list+1,list+cnt,cmp); graham(cnt); double sum1=0,sum2=0; double dx=fabs(list[stack[0]].x-list[stack[top]].x); double dy=fabs(list[stack[0]].y-list[stack[top]].y); sum1+=min(dx,dy); sum2+=fabs(dx-dy); for(int i=0;i<=top-1;i++) { double dx=fabs(list[stack[i]].x-list[stack[i+1]].x); double dy=fabs(list[stack[i]].y-list[stack[i+1]].y); sum1+=min(dx,dy); sum2+=fabs(dx-dy); } double ans=sqrt(2.0)*sum1+sum2; printf("%.10f\n",ans); } return 0; }
相关文章推荐
- UVAlive 6859 Points(凸包)
- UVALive 6859 Points (凸包)
- UVALive 6859 (凸包)
- UVaLive 6859 Points (几何,凸包)
- UVALive 6859 Points (凸包)
- UVALive 6859--凸包
- UVALive 6859 Points (凸包)
- = =回归。。【UVAlive】6859凸包
- UVA 6859 Points(凸包的应用)
- UVALive 4639 && SPOJ SPOINTS && POJ 3805 && AOJ 1298 Separate Points 求两个凸包是否相交 难度:3
- UVALive 3890 Most Distant Point from the Sea(凸包最大内接圆)
- uvalive 6859
- UVALive 6859
- UVALive 2453 Wall (凸包)
- UVALive4589 Asteroids(三维凸包【凸包重心)
- uvalive 4728(旋转卡壳求凸包最长直径)
- UVALive - 7461 Separating Pebbles 凸包+线段相交
- uvalive4838(凸包+重心)
- uvalive5090(三维凸包)
- UVALive 6859