hdu Surround the Trees
2024-09-08 16:48:50
题目链接:戳我
凸包模板
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 100010
using namespace std;
int n,top;
double ans;
struct Node{int x,y;}t[MAXN],s[MAXN];
inline bool cmp(struct Node a,struct Node b)
{
double A=atan2((a.y-t[1].y),(a.x-t[1].x));
double B=atan2((b.y-t[1].y),(b.x-t[1].x));
if(A!=B) return A<B;
else return a.x<b.x;
}
inline double cross(Node a,Node b,Node c){return (a.x-c.x)*(b.y-c.y)-(a.y-c.y)*(b.x-c.x);}
inline void solve()
{
t[0]=(Node){0x3f3f3f3f,0x3f3f3f3f};
int k=0;
for(int i=1;i<=n;i++)
if(t[i].y<t[0].y||(t[i].y==t[0].y&&t[i].x<t[0].x))
t[0]=t[i],k=i;
swap(t[1],t[k]);
sort(&t[2],&t[1+n],cmp);
s[0]=t[1],s[1]=t[2];
top=1;
for(int i=3;i<=n;i++)
{
while(top&&cross(s[top-1],t[i],s[top])>=0.0) top--;
s[++top]=t[i];
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
for(;;)
{
ans=0.0;
scanf("%d",&n);
if(!n) break;
for(int i=1;i<=n;i++)
scanf("%d%d",&t[i].x,&t[i].y);
solve();
if(top==0)
ans=0;
else if(top==1)
ans=sqrt((s[0].x-s[1].x)*(s[0].x-s[1].x)+(s[0].y-s[1].y)*(s[0].y-s[1].y));
else
{
s[++top]=s[0];
for(int i=0;i<top;i++)
{
Node a=s[i],b=s[i+1];
ans+=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
}
printf("%.2lf\n",ans);
}
return 0;
}
最新文章
- MSBuild 编译 C# Solution
- CSS系列:CSS中盒子模型
- Spring JdbcTemplate 方法详解
- iOS-- 重要的链接
- JavaScript 语句 数组与冒泡排序法
- SQL 数据类型,增删改查语句
- Delphi 串口通信数据位长度对传输数据的影响 转
- trigger 触发器
- js用for循环为对象添加事件并传递参数
- Sass入门——简介+语法格式及编译调试
- 网页制作之html基础学习6-CSS浏览器兼容问题
- PHP - 目录与文件
- 解决TXT乱码问题
- [UWP小白日记-14]正则表达式
- 浅谈sql优化
- sql操作一般函数
- 201521123117 《Java程序设计》第10周学习总结
- centos 使用 beyond compare 对比工具
- ubuntu1604安装谷歌游览器
- react组件选项卡demo