链接

luogu

模板一

上下利用斜率求凸包然后合并。

#include <bits/stdc++.h>
using namespace std;
const int N=10005;
const double eps=1e-10,inf=0x3f3f3f3f3f3f3f3f;
int n,stak[N],top;
struct point {
double x,y;
}a[N];
bool cmp(point a,point b) {
return a.x==b.x?a.y<b.y:a.x<b.x;
}
double dis(point a,point b) {
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double get_k(point a,point b) {
return a.x==b.x?inf:(a.y-b.y)/(a.x-b.x);
}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%lf%lf",&a[i].x,&a[i].y);
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;++i) {
while(top>=2&&get_k(a[stak[top-1]],a[stak[top]])<get_k(a[stak[top]],a[i])) top--;
stak[++top]=i;
}
double ans=0;
for(int i=1;i<top;++i) ans+=dis(a[stak[i]],a[stak[i+1]]);
top=0;
for(int i=n;i>=1;--i) {
while(top>=2&&get_k(a[stak[top-1]],a[stak[top]])<get_k(a[stak[top]],a[i])) top--;
stak[++top]=i;
}
for(int i=1;i<top;++i) ans+=dis(a[stak[i]],a[stak[i+1]]);
printf("%.2lf",ans);
return 0;
}

模板2

Graham算法

#include <bits/stdc++.h>
using namespace std;
const int N=1e4+6;
const double eps=1e-10;
struct point {
double x,y;
}P[N],tmp[N];
point operator - (point a,point b) {
return (point){a.x-b.x,a.y-b.y};
}
point operator + (point a,point b) {
return (point){a.x+b.x,a.y+b.y};
}
double operator * (point a,point b) {
return a.x*b.y-a.y*b.x;
}
int n,stak[N],top;
double dis(point a,point b) {
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
bool judge_onleft(int p0,int p1,int p2) {
double s=(P[p1]-P[p0])*(P[p2]-P[p0]);
return s<0||((s==0&&dis(P[p1],P[p0]))>=dis(P[p2],P[p0]));
}
bool cmp(point a,point b) {
double s=(a-P[1])*(b-P[1]);
return s<0||(s==0&&dis(a,P[1])>=dis(b,P[1]));
}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%lf%lf",&P[i].x,&P[i].y);
int First=1;
for(int i=2;i<=n;++i)
if(P[i].x<P[First].x||(P[i].x==P[First].x&&P[i].y<P[First].y)) First=i;
swap(P[First],P[1]);
sort(P+2,P+1+n,cmp);
P[n+1]=P[1];
stak[1]=1,stak[2]=2;
top=2;
for(int i=3;i<=n+1;++i) {
while(top>1&&judge_onleft(stak[top-1],i,stak[top])) top--;
stak[++top]=i;
}
top--;
double ans=0;
for(int i=1;i<top;++i) ans+=sqrt(dis(P[stak[i]],P[stak[i+1]]));
ans+=sqrt(dis(P[stak[top]],P[stak[1]]));
printf("%.2lf",ans);
return 0;
}

luogu 2742 二维凸包的更多相关文章

  1. Luogu P2742 模板-二维凸包

    Luogu P2742 模板-二维凸包 之前写的实在是太蠢了.于是重新写了一个. 用 \(Graham\) 算法求凸包. 注意两个向量 \(a\times b>0\) 的意义是 \(b\) 在 ...

  2. luogu P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows

    题解: 二维凸包裸题 按照x坐标为第一关键字,y坐标为第二关键字排序 然后相邻判断叉积用单调队列搞过去 正反都做一次就好了 代码: #include <bits/stdc++.h> usi ...

  3. 使用Graham扫描法求二维凸包的一个程序

    #include <iostream> #include <cstring> #include <cstdlib> #include <cmath> # ...

  4. 【洛谷 P2742】【模板】二维凸包

    题目链接 二维凸包板子..有时间会补总结的. #include <cstdio> #include <cmath> #include <algorithm> usi ...

  5. poj 2079 Triangle (二维凸包旋转卡壳)

    Triangle Time Limit: 3000MS   Memory Limit: 30000KB   64bit IO Format: %I64d & %I64u Submit Stat ...

  6. poj 2187 Beauty Contest(二维凸包旋转卡壳)

    D - Beauty Contest Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...

  7. UVA 10652 Board Wrapping(二维凸包)

    传送门 刘汝佳<算法竞赛入门经典>P272例题6包装木板 题意:有n块矩形木板,你的任务是用一个面积尽量小的凸多边形把它们抱起来,并计算出木板占整个包装面积的百分比. 输入:t组数据,每组 ...

  8. 【计算几何】二维凸包——Graham's Scan法

    凸包 点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上或者在其内.右图中由红色线段表示的多边形就是点集Q={p0,p1,...p12}的凸包. 一组平面上的点, ...

  9. 计算几何 二维凸包问题 Andrew算法

    凸包:把给定点包围在内部的.面积最小的凸多边形. Andrew算法是Graham算法的变种,速度更快稳定性也更好. 首先把全部点排序.依照第一keywordx第二keywordy从小到大排序,删除反复 ...

随机推荐

  1. ES7.3.0配置邮件告警

    情况说明: 三台es组成集群,一台kibana,版本均为7.3.0 es版本要求是白金版,基础版的不行,不过可以试用30天的白金版 步骤:先说我自己走通的流程,然后介绍官方说明 1.因为我这边使用的是 ...

  2. MySQL“慢SQL”定位

    MySQL"慢SQL"定位 数据库调优我个人觉得必须要明白两件事 1.定位问题(你得知道问题出在哪里,要不然从哪里调优呢) 2.解决问题(这个没有基本的方法来处理,因为不同的问题处 ...

  3. Xgboost GPU配置

    眼残cmake版本配错了搞了半天,简单记录一下,老规矩,参考一下官方的文档. git clone --recursive https://github.com/dmlc/xgboost cd xgbo ...

  4. SpringBoot中使用@scheduled定时执行任务需要注意的坑

    spring boot: 计划任务@ EnableScheduling和@Scheduled @Scheduled中的参数说明 @Scheduled(fixedRate=2000):上一次开始执行时间 ...

  5. .NET Core中如何对Url进行编码和解码

    我们在.NET Core项目中,可以用WebUtility类对Url进行编码和解码,首先我们要确保项目中引入了nuget包:System.Runtime.Extensions 当然这个nuget包默认 ...

  6. node-exporter常用指标含义,比如在prometheus中查询node_load1的指标数据

    参考: https://blog.csdn.net/yjph83/article/details/84909319 https://www.gitbook.com/book/songjiayang/p ...

  7. C# 从注册表判断指定ocx控件是否已注册 以及获取它的注册路径

    /// <summary> /// 注册控件 /// </summary> /// <returns></returns> public bool Re ...

  8. 【Java】调用摄像头进行拍照并保存【详细】以及处理no jniopencv_core in java.library.path的一种方法

    [之前困扰笔者的问题描述]   date:2019.12.18 网上教程很多,但是没有看见完整的,所以写一个出来. 调用摄像头需要javaCV的jar包和openCV的jar包,现在已经不需要安装包了 ...

  9. 交互式脚本expect场景示例

    expect语法示例 #spawn 新建一个进程,这个进程的交互由expect控制 #expect 等待接受进程返回的字符串,直到超时时间,根据规则决定下一步操作 #send 发送字符串给expect ...

  10. JavaScript 之 navigator 对象

    navigator 对象可以查看用户所使用的浏览器类型和系统平台类型. 1.userAgent  通过 userAgent 可以判断用户浏览器的类型. Chrome 浏览器效果: 2.platform ...