P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows
题意: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的更多相关文章
- luogu P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows
题解: 二维凸包裸题 按照x坐标为第一关键字,y坐标为第二关键字排序 然后相邻判断叉积用单调队列搞过去 正反都做一次就好了 代码: #include <bits/stdc++.h> usi ...
- [洛谷P2742]【模板】二维凸包([USACO5.1]圈奶牛Fencing the Cows)
题目大意:求一个点集凸包边长 题解:求凸包,直接求 卡点:发现在较后面数位上有较小的误差,还以为是浮点数误差,最后发现是构造函数写成了$int$类型 C++ Code: #include <al ...
- 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows
Problem surface 戳我 Meaning 坐标系内有若干个点,问把这些点都圈起来的最小凸包周长. 这道题就是一道凸包的模板题啊,只要求出凸包后在计算就好了,给出几个注意点 记得检查是否有吧 ...
- LG2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows
题意 题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 ...
- luoguP2742 【模板】二维凸包 / [USACO5.1]圈奶牛 二维凸包
我们知道,纵坐标最小的点一定在凸包上(如果有多个,那它们都会被取到) 随便找一个纵坐标最小的点,将其他所有点按照这个点为原点极角排序,我们发现极角大的会在极角小的后面加入(感性认知一下) 考虑新(加入 ...
- Luogu P2742 模板-二维凸包
Luogu P2742 模板-二维凸包 之前写的实在是太蠢了.于是重新写了一个. 用 \(Graham\) 算法求凸包. 注意两个向量 \(a\times b>0\) 的意义是 \(b\) 在 ...
- 洛谷 P2742 [USACO5.1]圈奶牛Fencing the Cows
题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 输入 ...
- 洛谷 P2742 [USACO5.1]圈奶牛Fencing the Cows || 凸包模板
整篇都是仅做记录... 蓝书上的板子.水平序,单调栈.先求下凸包,再求上凸包.叉积的作用是判定向量的位置关系. 48行的作用是在求上凸包的时候不至于去删下凸包中的点.上凸包中第一个点被认为是t1. 另 ...
- P2742 [USACO5.1]圈奶牛Fencing the Cows
题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 输入 ...
随机推荐
- Git之Eclipse提交项目到Github并实现多人协作
一.Eclipece提交项目到Github 见 eclipse提交项目到github 二.利用github组织实现多人协作 1.新建组织: New organization
- jQuery 参考手册 - 选择器
jQuery 选择器 选择器 实例 选取 * $("*") 所有元素 #id $("#lastname") id="lastname" 的元 ...
- 第二章 python基础(三)
第十六节 MySQLdb win64位安装python-mysqldb1.2.5 ubuntu下安装MySQLdb sudo apt-get install python-MySQLdb 导入MySQ ...
- ffpanel --ffmpeg的GUI,让ffmpeg离开黑黑的命令行
程序及源码下载地址 :https://github.com/langsim/ffpanel from:http://blog.csdn.net/langsim/article/details/47 ...
- CodeForces Gym 100228 Graph of Inversions
题目大意 对于一个长为$N$的序列$A$,定义它所对应的逆序图: 有$N$个点组成,标号为$1...N$的无向图,对于每一组$i,j(i<j)$若存在$A_i>A_j$则在新图中就存在一条 ...
- iPhone X机型适配
1.启动页 启动App,发现App只能居中显示,不能上下充满. 问题产生的原因是:iPhone X是5.8英寸,比5.5英寸的屏幕还要大,没有合适的启动页可以加载,所以只能使用以前5.5英寸的启动页, ...
- 安装ORACLE时在Linux上设置内核参数的含义
前两天看到一篇Redhat官方的Oracle安装文档,对于Linux内核参数的修改描述的非常清晰. 安装Oracle之前,除了检查操作系统的硬件和软件是否满足安装需要之外,一个重点就是修改内核参数,其 ...
- socket发送结构体
struct send_info {char info_from[20]; //发送者IDchar info_to[20]; //接收者IDint info_length; //发送的消息主体的长度c ...
- GSM/GPRS操作示例
A6(GPRS) 博文转自安信科技: http://wiki.ai-thinker.com/gprs/examples 1.电话接收 相关指令 ATDxxxxx;//xxx为电话号码 示例 打电话 ...
- [FATAL_ERROR] Uncaught PDOException: There is already an active transaction
[FATAL_ERROR] Uncaught PDOException: There is already an active transaction ... $mysql->beginTran ...