USACO 5.1.1 凸包模板(水平序)
2015-11-30 22:09
239 查看
/* ID: liaoxg72 PROB: fc LANG: C++ */ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> using namespace std; const int dmax=100000+100; const double INF=1000000000; struct node{ double x,y; }; struct node a[dmax]; int c[dmax]; double solve(int u,int v){ double p=(a[u].y-a[v].y),q=(a[u].x-a[v].x); if (q==0) return 0; return p/q; } double dist(int u,int v){ double p=a[u].x-a[v].x,q=a[u].y-a[v].y; p*=p,q*=q; q+=p; q=sqrt(q); return q; } int cmp(const node &u,const node &v){ return u.x<v.x; } int main(){ int i,j,k,m,n; freopen("fc.in","r",stdin); freopen("fc.out","w",stdout); scanf("%d",&n); for (i=1;i<=n;i++) scanf("%lf%lf",&a[i].x,&a[i].y); sort(a+1,a+n+1,cmp); int top=0; double ans=0; c[++top]=1; for (i=2;i<=n;i++){ while (solve(c[top-1],c[top])>solve(c[top],i) && top>1) top--; c[++top]=i; } for (i=1;i<top;i++) ans+=dist(c[i],c[i+1]); memset(c,0,sizeof(c)); top=1; c[top]=1; for (i=2;i<=n;i++){ while (solve(c[top-1],c[top])<solve(c[top],i) && top>1) top--; c[++top]=i; } for (i=1;i<top;i++) ans+=dist(c[i],c[i+1]); printf("%.2lf\n",ans); return 0; }
相关文章推荐
- hadoop学习006
- 最大子列和问题
- 仿UC天气下拉和微信下拉眼睛头部淡入淡出--第三方开源--PullLayout
- EF中的开放式并发(EF基础系列)
- 汇编学习笔记杂项
- POJ1163DP
- 浅谈 Nim 中的“接口”
- date转String
- 使用指针的方式遍历图像数据
- 什么是对象?
- 20135310陈巧然家庭作业汇总[3.56 3.67 6.23 6.39.6.40 6.41]
- 欢迎使用CSDN-markdown编辑器
- 值得深思:美国感恩节78.3%的网购来自iOS
- git常用命令及技巧
- 特征表达——统计、hash、embedding
- 浅谈 Nim 中的“接口”
- JAVAWEB之自定义TAG开发二
- 终极解释: java方法传递参数的方式
- 第二个Sprint ------第四、五、六、七天
- 黑马程序员--集合框架(collection)