[洛谷P2742]【模板】二维凸包([USACO5.1]圈奶牛Fencing the Cows)
题目大意:求一个点集凸包边长
题解:求凸包,直接求
卡点:发现在较后面数位上有较小的误差,还以为是浮点数误差,最后发现是构造函数写成了$int$类型
C++ Code:
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <iostream>
#include <iomanip>
#define maxn 10010 inline double sqr(double x) { return x * x; }
struct Point {
double x, y;
Point() { }
Point(double __x, double __y) : x(__x), y(__y) { }
inline Point operator - (const Point &rhs) const {
return Point(x - rhs.x, y - rhs.y);
}
inline Point operator + (const Point &rhs) const {
return Point(x + rhs.x, y + rhs.y);
}
inline double operator * (const Point &rhs) const {
return x * rhs.y - y * rhs.x;
}
} O, s[maxn], v[maxn];
inline double abs2(const Point &x) { return sqr(x.x) + sqr(x.y); }
inline double dis(const Point &lhs, const Point &rhs) { return sqrt(abs2(rhs - lhs)); }
inline double det(const Point &O, const Point &lhs, const Point &rhs) {
return (lhs - O) * (rhs - O);
}
inline bool operator < (const Point &lhs, const Point &rhs) {
static Point X, Y; X = lhs - O, Y = rhs - O;
static double t; t = X * Y;
return (t > 0) || (t == 0 && abs2(X) > abs2(Y));
} int n, tot;
int main() {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
std::cin >> n;
if (n <= 1) {
std::cout << "0\n";
return 0;
}
int miny = 0;
for (int i = 0; i < n; ++i) {
std::cin >> s[i].x >> s[i].y;
if ((s[i].y < s[miny].y) || (s[i].y == s[miny].y && s[i].x < s[miny].x)) miny = i;
}
if (n == 2) {
std::cout << std::fixed << std::setprecision(2) << dis(s[0], s[1]) * 2 << '\n';
return 0;
}
O = s[miny]; std::swap(s[0], s[miny]);
std::sort(s + 1, s + n);
v[0] = s[0], v[1] = s[1], v[2] = s[2], tot = 3;
for (int i = 3; i < n; ++i) {
for (Point a = v[tot - 2], b = v[tot - 1]; tot > 2 && det(a, b, s[i]) <= 0; a = v[tot - 2], b = v[tot - 1]) --tot;
v[tot++] = s[i];
}
double ans = 0;
for (int i = 0, nxt = 0; i < tot; ++i) {
nxt += 1 - tot;
nxt += nxt >> 31 & tot;
ans += dis(v[i], v[nxt]);
}
std::cout << std::fixed << std::setprecision(2) << ans << '\n';
return 0;
}
[洛谷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
题意:n个点,求凸包周长.(纯板子QAQ) 定义 凸包:用最小的凸多边形将n个点围在里面的图形为凸包 前置 向量:点积:(a,b) (c,d)=(a*c,b*d) =|(a,b)|*|(c,d)|*c ...
- LG2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows
题意 题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 ...
- 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows
Problem surface 戳我 Meaning 坐标系内有若干个点,问把这些点都圈起来的最小凸包周长. 这道题就是一道凸包的模板题啊,只要求出凸包后在计算就好了,给出几个注意点 记得检查是否有吧 ...
- 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
题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 输入 ...
随机推荐
- Drupal 判断匿名用户必须先登录的解决方法
要实现如果是匿名用户点击checkout链接,要求先登录 方案一.通过添加Rules规则实现 EVENT:After adding a product to the cart Conditions : ...
- IAR调试cc2541串口遇到的Warning : Possible IDATA stack overflow detected
1. 遇到的错误如下,似乎是栈空间不够使用 2. 修改界面如下,增加IDATA的大小,不过最大似乎是0XFF.
- memory引擎和innodb引擎速度对比
ysql> insert into innodb_test (name) select name from innodb_test; Query OK, rows affected ( min ...
- java 前后端 日期转换
1.前传后 @DateTimeFormat(pattern="yyyy-MM-dd") private Date payTime; 2.后传前 @JsonFormat(patter ...
- Appium安装教程
一.适用操作系统Win7 旗舰版Sp1 64位操作系统 或 32位操作系统二.所需软件jdk-7u45-windows-i586.exenode-v0.10.28-x86.msi (32位)下载地址: ...
- 如何编写 Python 程序
如何编写 Python 程序 从今以后,保存和运行 Python 程序的标准步骤如下: 对于 PyCharm 用户 打开 PyCharm. 以给定的文件名创建新文件. 输入案例中给出的代码. 右键并运 ...
- 安迪的第一个字典 (Andy's First Dictionary,UVa10815)
题目描述: #include<iostream> #include<string> #include<set> #include<sstream> us ...
- yarn logs -applicationId命令java版本简单实现
import java.io.DataInputStream; import java.io.EOFException; import java.io.FileNotFoundException; i ...
- 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第二道——最小分割分数
题目: 给 n 个正整数 a_1,…,a_n, 将 n 个数顺序排成一列后分割成 m 段,每一段的分数被记为这段内所有数的和,该次分割的分数被记为 m 段分数的最大值.问所有分割方案中分割分数的最小值 ...
- 让我们一起来做最漂亮的Android界面吧!
让我们一起来做最漂亮的Android界面吧! AndroidiOS产品设计 摘要:如何为Android设备量身定制以打造出最为完美的应用?这是让诸多开发者很是头疼的问题.不同于iOS,Android设 ...