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
题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 输入 ...
随机推荐
- 【leetcode刷题笔记】Maximum Depth of Binary Tree
Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...
- BZOJ5324 JXOI2018 守卫
传送门 这是我见过的为数不多的良心九怜题之一 题目大意 给定一段$n$个点构成的折线,第$i$个折点的坐标是$(i,h_i)$,你可以在$i$点放置一个视野,定义$i$能看到$j$当且仅当$i$处有视 ...
- CH5103 [NOIP2008]传纸条[线性DP]
给定一个 N*M 的矩阵A,每个格子中有一个整数.现在需要找到两条从左上角 (1,1) 到右下角 (N,M) 的路径,路径上的每一步只能向右或向下走.路径经过的格子中的数会被取走.两条路径不能经过同一 ...
- nodejs调试:node-inspector
基于Chrome浏览器的调试器 既然我们可以通过V8的调试插件来调试,那是否也可以借用Chrome浏览器的JavaScript调试器来调试呢?node-inspector模块提供了这样一种可能.我们需 ...
- 什么是Nginx?为什么使用Nginx?
源自 https://blog.csdn.net/yougoule/article/details/78186138 一.前言 为毛要用nginx服务器代理,不直接用tomcat 7.0,还 ...
- JasperReports项目中的应用
转自:http://www.blogjava.net/vjame/archive/2013/10/12/404908.html . 2.业务处理 //返回报表查询结果 List<ReportEl ...
- python 基础 列表生成式
data = {'a':'abc';'b':'bac','c':'cba'} [v for k,v in data] 结果 ['abc','bca','cba'] 格式 [x for x in 内容 ...
- 在虚拟机中的Ubuntu搭建java开发环境
前提: 安装好虚拟机 在虚拟机中装好了Ubuntu系统 以上两步请参见我的博客(python进阶) 1 安装JDK 1.1 到官网下载jdk压缩包并保存在本地 jdk1.8:点击前往 1.2 在Ubu ...
- 卡特兰数&错排&一个一直记不住的公式
卡特兰数 公式:f(x)=f(2)*f(x-1)+f(3)*f(x-2)+......+f(x-1)*f(2) #include<iostream>#include<cstdlib& ...
- MySql中的锁(表锁,行锁)
锁是计算机协调多个进程或春线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU,RAM,I/O)的争用之外,数据也是一种工许多用户共享的资源.如何保证数据并发访问的一致性,有效性是所有数据 ...