Luogu P2742 模板-二维凸包

  • 之前写的实在是太蠢了.于是重新写了一个.
  • 用 \(Graham\) 算法求凸包.
  • 注意两个向量 \(a\times b>0\) 的意义是 \(b\) 在 \(a\) 的左侧,于是可以用这个方法判断是否弹点.
  • 写的时候注意细节:确定原点时的比较和排序时的比较是不同的,并且排序时不要把原点加入.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pii pair<int,int>
inline int read()
{
int x=0;
bool pos=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
pos=0;
for(;isdigit(ch);ch=getchar())
x=x*10+ch-'0';
return pos?x:-x;
}
const int MAXN=1e4+10;
int n;
struct v2
{
double x,y;
v2(double x=0,double y=0):x(x),y(y) {}
friend double operator * (const v2 &a,const v2 &b)
{
return a.x*b.y-a.y*b.x;
}
friend v2 operator + (const v2 &a,const v2 &b)
{
return v2(a.x+b.x,a.y+b.y);
}
friend v2 operator - (const v2 &a,const v2 &b)
{
return v2(a.x-b.x,a.y-b.y);
}
bool operator < (const v2 &rhs) const
{
return x==rhs.x?y<rhs.y:x<rhs.x;
}
double modulus()
{
return sqrt(x*x+y*y);
}
double angle()
{
return atan2(y,x);
}
}p[MAXN];
v2 origin;
bool cmp(const v2 &a,const v2 &b)
{
double a1=(a-origin).angle();
double a2=(b-origin).angle();
return a1==a2?a.x<b.x:a1<a2;
}
v2 stk[MAXN];
int tp=0;
void ConvexHull()
{
for(int i=2;i<=n;++i)
if(p[i]<p[1])
swap(p[i],p[1]);
origin=p[1];
sort(p+2,p+n+1,cmp);
for(int i=1;i<=n;++i)
{
while(tp>=2 && (stk[tp]-stk[tp-1])*(p[i]-stk[tp])<=0)
--tp;
stk[++tp]=p[i];
}
stk[++tp]=p[1];
}
double calcC()
{
double s=0;
for(int i=1;i<tp;++i)
s+=(stk[i+1]-stk[i]).modulus();
return s;
}
int main()
{
n=read();
for(int i=1;i<=n;++i)
{
double x,y;
scanf("%lf%lf",&x,&y);
p[i]=v2(x,y);
}
ConvexHull();
double ans=calcC();
printf("%.2lf\n",ans);
return 0;
}

Luogu P2742 模板-二维凸包的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. luogu P2742 【模板】二维凸包

    嘟嘟嘟 没错,我开始学凸包了. 其实挺简单的. 前置技能: 1.极坐标系 2.向量叉积 1.极坐标系 就是一种二维坐标系.只不过两个坐标分别表示向量和极轴的角度和自身的长度.对于不同的问题,极轴可以自 ...

随机推荐

  1. gdb 调试coredump文件过程:

    第一步:首先需要一个进程的coredump文件,怎么搞出coredump文件呢? 1. ps -fax|grep                 进程名称 找到进程的pid 2.gdb -p pid ...

  2. Pandas 的使用

    1. 访问df结构中某条记录使用loc或者iloc属性.loc是按照index或者columns的具体值,iloc是按照其序值.访问类似于ndarray的访问,用序列分别表示一维和二维的位置. 例如: ...

  3. php入门(三)

    PHP 面向对象: 在php5中 var就是public的别名. 变量 $this 代表自身的对象. PHP_EOL;为换行符 构造函数+析构函数 <?php class Site { /* 成 ...

  4. 使用jsonp去访问跨域数据,回调使用数据

    var foo = function (data) { console.log("foo", data)} var testJsonP = function () { $.ajax ...

  5. ubuntu mac terminal install software

    http-server // ubuntu sudo npm install http-server -g npm node.js yarn

  6. Zookeeper在 Linux 系统的安装

    安装步骤:第一步:安装 jdk第二步:把 zookeeper 的压缩包上传到 linux 系统.Alt+P 进入 SFTP ,输入 put d:\zookeeper-3.4.6.tar.gz 上传第三 ...

  7. 解决Mac外接显示器分辨率不正确问题

    解决Mac外接显示器分辨率不正确问题 TAT: 今天被坑惨了,重新安装了Mavericks后,使用thunderbolt转VGA外接显示器时遇到了分辨率的问题:外接显示器支持1080P的分辨率,但在O ...

  8. ana3+opencv+TensorFlow+NVIDIAGPU 安装

    http://blog.csdn.net/qq_30611601/article/details/79067982 这个博客写的挺完整的 当你发现你的anna下载的贼鸡儿的慢,你就需要使用清华的镜像网 ...

  9. HDU 4274 Spy's Work (树形DP)

    题意 给定一棵树,给出一些子树的权值关系,问是否矛盾(初始所有结点的下限为1) 思路 设lmin和lmax表示题目给定的限制范围,默认为[1..oo]:amin和amax表示实际符合要求的范围.从根节 ...

  10. Xcode各版本

    官方下载, 用开发者账户登录,建议用Safari浏览器下载. 官方下载地址: https://developer.apple.com/xcode/downloads/ Xcode 7 beta 3:h ...