博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[洛谷P2742]【模板】二维凸包([USACO5.1]圈奶牛Fencing the Cows)
阅读量:6266 次
发布时间:2019-06-22

本文共 2088 字,大约阅读时间需要 6 分钟。

题目大意:求一个点集凸包边长

题解:求凸包,直接求

卡点:发现在较后面数位上有较小的误差,还以为是浮点数误差,最后发现是构造函数写成了$int$类型

 

C++ Code:

#include 
#include
#include
#include
#include
#define maxn 10010inline 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;}

  

转载于:https://www.cnblogs.com/Memory-of-winter/p/10348966.html

你可能感兴趣的文章
架构,改善程序复用性的设计~目录(附核心原代码)
查看>>
逆向反汇编代码推算C++的局部变量
查看>>
100个推荐的图片/内容滑动条
查看>>
秋式广告杀手:广告拦截原理与杀手组织
查看>>
内存溢出
查看>>
如何重启IIS进程
查看>>
分享一个javascript alert精简框架
查看>>
【解决方法】System.IO.FileNotFoundException
查看>>
Android 命令行编译、打包生成apk文件
查看>>
java中解决组件重叠的问题(例如鼠标移动组件时)
查看>>
使用 Navicat 8.0 管理mysql数据库(导出导入数据)
查看>>
视频会议
查看>>
EntityFramework系列:SQLite.CodeFirst自动生成数据库
查看>>
网络编码
查看>>
定时任务-在spring中配置quartz
查看>>
【springMVC 后台跳转前台】1.使用ajax访问的后台,后台正常执行,返回数据,但是不能进入前台的ajax回调函数中 ----2.前后台都没有报错,不能进入ajax回调函数...
查看>>
redis+Keepalived主从热备秒级切换
查看>>
Hibernate占位符警告:use named parameters or JPA-style positional parameters instead.
查看>>
基于 IdentityServer3 实现 OAuth 2.0 授权服务数据持久化
查看>>
是什么时候开始学习gulp了
查看>>