题意:n个点,求凸包周长。(纯板子QAQ)

定义

凸包:用最小的凸多边形将n个点围在里面的图形为凸包

前置

向量:点积:(a,b) (c,d)=(a*c,b*d) =|(a,b)|*|(c,d)|*cos<(a,b),(c,d)>;

叉积:(a,b) (c,d)=a*d-b*c=|(a,b)|*|(c,d)|*sin<(a,b),(c,d)>;

      几何意义:以(a,b)(c,d)两向量作平行四边形,它俩的叉积为其面积

          故有三角形面积=$\large{\frac{1}{2}*|(a,b)|*|(c,d)|*sin<(a,b),(c,d)>}$

极角:与x轴的夹角,STL库有atan2函数,atan2(y,x)求出向量(x,y)的极角

算法

1、找到最左下的点,以其为原点建立平面直角坐标系

2、求出各点新坐标以及极角

3、以极角为关键字从小到大排序

4、前三个点入栈

5、用叉积判方向看当前栈顶应不应该留下,留下则当前点入栈,否则一直弹(直到能够留下)

6、第5步后,栈中元素即为所需点,相邻两个作差求模长,累计即为答案

#include<algorithm>
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
#define olinr return
#define love_nmr 0
struct node
{
double x,y,jj;
node():x(),y(),jj(){}
friend node operator - (const node &a,const node &b)
{
node c;
c.x=a.x-b.x;
c.y=a.y-b.y;
olinr c;
}
friend double operator ^ (const node &a,const node &b)
{
olinr a.x*b.y-a.y*b.x;
}
double mo()
{
olinr sqrt(x*x+y*y);
}
friend bool operator < (const node &a,const node &b)
{
olinr a.jj<b.jj;
}
}cow[];
int n;
double ans;
int s[];
int top;
int minn=;
inline void swap(node &x,node &y)
{
node t=x; x=y; y=t;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%lf%lf",&cow[i].x,&cow[i].y);
if((cow[i].y<cow[minn].y)||((cow[i].y==cow[minn].y)&&(cow[i].x<cow[minn].x))) minn=i;
}
swap(cow[],cow[minn]);
for(int i=;i<=n;i++)
{
cow[i].x-=cow[].x;
cow[i].y-=cow[].y;
cow[i].jj=atan2(cow[i].y,cow[i].x);
}
cow[].x=;
cow[].y=;
sort(cow+,cow++n);
s[]=;
s[]=;
s[]=;
top=;
for(int i=;i<=n;i++)
{
while(top>&&((cow[s[top]]-cow[s[top-]])^(cow[i]-cow[s[top]]))<)
top--;
s[++top]=i;
}
for(int i=;i<top;i++)
ans+=(cow[s[i+]]-cow[s[i]]).mo();
ans+=(cow[n]-cow[]).mo();
printf("%.2lf",ans);
olinr love_nmr;
}

P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows的更多相关文章

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

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

  2. [洛谷P2742]【模板】二维凸包([USACO5.1]圈奶牛Fencing the Cows)

    题目大意:求一个点集凸包边长 题解:求凸包,直接求 卡点:发现在较后面数位上有较小的误差,还以为是浮点数误差,最后发现是构造函数写成了$int$类型 C++ Code: #include <al ...

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

    Problem surface 戳我 Meaning 坐标系内有若干个点,问把这些点都圈起来的最小凸包周长. 这道题就是一道凸包的模板题啊,只要求出凸包后在计算就好了,给出几个注意点 记得检查是否有吧 ...

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

    题意 题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 ...

  5. luoguP2742 【模板】二维凸包 / [USACO5.1]圈奶牛 二维凸包

    我们知道,纵坐标最小的点一定在凸包上(如果有多个,那它们都会被取到) 随便找一个纵坐标最小的点,将其他所有点按照这个点为原点极角排序,我们发现极角大的会在极角小的后面加入(感性认知一下) 考虑新(加入 ...

  6. Luogu P2742 模板-二维凸包

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

  7. 洛谷 P2742 [USACO5.1]圈奶牛Fencing the Cows

    题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 输入 ...

  8. 洛谷 P2742 [USACO5.1]圈奶牛Fencing the Cows || 凸包模板

    整篇都是仅做记录... 蓝书上的板子.水平序,单调栈.先求下凸包,再求上凸包.叉积的作用是判定向量的位置关系. 48行的作用是在求上凸包的时候不至于去删下凸包中的点.上凸包中第一个点被认为是t1. 另 ...

  9. P2742 [USACO5.1]圈奶牛Fencing the Cows

    题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 输入 ...

随机推荐

  1. AngularJS-指令command

    directive: 匹配模式restrict:'AEMC'默认为A template templateUrl templateCache:把模板缓存起来,共多个指令使用 var myModule = ...

  2. Linux上用nginx搭建RTMP服务器

    参考文章:https://obsproject.com/forum/resources/how-to-set-up-your-own-private-rtmp-server-using-nginx.5 ...

  3. bzoj 4044: Virus synthesis 回文自动机

    题目大意: 你要用ATGC四个字母用两种操作拼出给定的串: 将其中一个字符放在已有串开头或者结尾 将已有串复制,然后reverse,再接在已有串的头部或者尾部 一开始已有串为空.求最少操作次数. le ...

  4. mina中的发送延时

    由于项目需要,用到了 mina 框架进行 tcp 通讯.我是初次接触 mina,于是从 Hello world 开始学习了 mina .期间遇到了一个奇怪的发送数据的延迟问题,解决的过程是曲折的,但找 ...

  5. wpf staticresource 是不允许向前引用(forward reference)的

    不允许向前引用(forward reference)在C/C++中中很常见,即在语法上,未定义变量.类之前,不能使用. 没想到wpf中的wpf staticresource也遵循这种规则.资源字典中, ...

  6. c++对象导出到lua

    转自:http://www.cnblogs.com/ringofthec/archive/2010/10/26/luabindobj.html 虽然有tolua++, luabind等等, 不过自己手 ...

  7. kvm虚拟机命令梳理

    kvm虚拟机命令梳理 )查看KVM虚拟机配置文件及运行状态 KVM虚拟机默认配置文件位置: /etc/libvirt/qemu/ autostart目录是配置kvm虚拟机开机自启动目录. virsh命 ...

  8. Python模块-shelve模块

    shelve模块也是用来序列化的,可以持久化任何pickle可支持的python数据格式,比pickle好用,也是python专属,可以dump多次数据,也可以直接修改数据 序列化 # -*- cod ...

  9. 删除 char[10][10] 中的一行

    1. 描述 删除二维字符数组其中一行,并用下一行进行填补 2. 代码 #include <iostream> #include <string.h> using namespa ...

  10. Mysql 数据库时间更新字段

    关于时间更新: 创建时间: CURRENT_TIMESTAMP 更新时间: 勾选根据时间戳更新