[日常摸鱼]HDU1348Wall-凸包
2024-10-16 02:38:40
我学习进度慢得连我自己都怕…
题意:大概给$n$个点搞出它的凸包,然后还要在凸包外弄一层厚为$l$的东西,求这个东西的周长
我个滞涨居然把pi开成了int…搞了一个晚上才看见
凸包直接求,因为是凸多边形所以答案就是凸包的周长加上$2 \pi l$
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1005;
const double pi=acos(-1);
struct Point
{
double x,y;
Point(double x=0,double y=0):x(x),y(y){}
}p[N];
int T,n,L;
int q[N];
inline Point operator - (Point a,Point b)
{
return Point(a.x-b.x,a.y-b.y);
}
inline double Cross(Point a,Point b)
{
return a.x*b.y-a.y*b.x;
}
inline double sqr2(double x){return x*x;}
inline double lenght(Point a,Point b)
{
return sqrt(sqr2(a.x-b.x)+sqr2(a.y-b.y));
}
inline bool cmp(const Point &a,const Point &b)
{
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
inline int convexHull()
{
sort(p+1,p+n+1,cmp);
int m=0;
for(register int i=1;i<=n;i++)
{
while(m>=2&&Cross(p[q[m]]-p[q[m-1]],p[i]-p[q[m-1]])<=0)m--;
q[++m]=i;
}
int k=m;
for(register int i=n-1;i>=1;i--)
{
while(m>k&&Cross(p[q[m]]-p[q[m-1]],p[i]-p[q[m-1]])<=0)m--;
q[++m]=i;
}
if(n>1)m--;
return m;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&L);
for(register int i=1;i<=n;i++)scanf("%lf%lf",&p[i].x,&p[i].y);
int m=convexHull();double ans=0;
for(register int i=2;i<=m;i++)ans+=lenght(p[q[i]],p[q[i-1]]);
ans+=lenght(p[q[m]],p[q[1]]);
ans+=2*pi*L;
printf("%.0lf\n",ans);
if(T)printf("\n");
}
return 0;
}
最新文章
- HDU 2045 不容易系列之(3)―― LELE的RPG难题(递推)
- 处理session跨域几种的方案
- JavaScript笔记:对象及数组
- Centos下编译JDK
- DHL 快递跟踪查询
- 高斯混合模型与EM算法
- 第七课第四节,T语言流程语句(版本5.0)
- 我的STL之旅 MyStack
- 【Win10】解决 模拟器调试手机 错误->; 引导阶段... 无法找到指定路径......\2052\msdbgui.dll
- dede如何新建一个ajax服务端输出文件
- Combobox 成员添加
- Shapely介绍及用户手册
- solr源码导入eclipse
- C#/winform 旅游管理信息系统
- CocoaPods的安装及设置
- TangoWalk小组课程与优惠(20131208更新) | TangoWalk 学跳阿根廷探戈舞
- css--用户体验笔记及兼容记录
- 如何按内容筛选dom
- 用于 C&;sharp; 图像识别的轮廓分析技术
- WebApiClient库支持AOT