计算几何学习5

今天算是把半平面交的nlogn版本搞出来了

也做了一些半平面交的经典题

最重要的是感受到了 计算几何的精度的深深的恶意

nlogn的做法 和凸包类似 维护一个直线的双端队列

极角排序后每次加入一条直线都从队首队尾弹出无效直线

在加入时和队尾直线产生交点

最后队首队尾产生交点

中间还有当队尾两直线向量共线时的问题需要处理一下

总感觉 n^2的做法虽然慢 但是精度似乎比nlogn的要靠谱

计算几何很多特殊情况的处理让人很蛋疼

poj 3335 模板

试了下 nlogn 和 n ^ 2板子

其他比较简单的不再说

POJ 3525

让你求一个距离凸多边形内部到边界距离最远的点

很经典的做法

我们二分距离 d

然后把多边形的边界 都向内侧推移d

再看他有没有核(一个点也行)

很显然 核存在意味着 >=d的点存在

问题就结束了

poj 3384

给你一个凸多边形

问用两个固定半径的圆怎样覆盖尽可能多的多边形内部

(圆可以重叠, 圆在多边形内 不能和多边形交,或者包含它)

(数据保证有解)

很显然 这两个圆最后的位置一定是与多边形相切

那我们想上一题类似的把多边形边界向内推移R的距离

核就是圆心的合法放置区域

我们尽量不让圆重叠

所以选取核的距离最远点

数据范围很小

没必要旋转卡壳 直接枚举顶点即可

poj 1755

铁人三项 每个人有三个速度 ai,bi,ci

问有没有一种分配策略来分配三项比赛的路程,使第i个人用时最短 (不能并列)

乍看可能和半平面交比较远

但是转换一下

假如 我们让i最先到达终点 x,y,z为三项比赛长度(x>0, y >0 , z > 0)

总有 x/ai + y/bi + z/ci < x/aj + y/bj + z/cj 对 i != j 成立

整理一下 (1/aj - 1/ai) * x + (1/bj - 1/aj) *y + (1/cj - 1/ci) * z > 0

在z>0时 (1/aj - 1/ai) * x / z+ (1/bj - 1/aj) * y / z + (1/cj - 1/ci) > 0

然后就很明显了 再加上 x/z > 0  y/z > 0

需要注意的是 转化后 X Y是比值 因此 x, y ,z均为负数也可能成立

光限制 x/z > 0 y/z >0 也无用

其实先处理出 三项均大于等于 三项均小于 就不会出现全负的情况了

白书上 是默认 总路程为1 这样就可以更清晰地解决这个问题 (再加上 x + y < 1的约束)

但是写的过程中出现了很多问题 让我很难受

1) 点赋值时 写成了 (x, y)  其实是 (Point) {x, y}

2) poly 和 p数组经常混淆 尤其是求面积时

3)inf和eps 可能需要随着问题调整 看数据范围 还有N不要忘记范围

4)在判断无核时一是用面积 而是直接看返回值 nlogn看返回值还比较稳 n ^ 2可能会留下非法点 面积吧

一些条件 退化为线段 或 点也可以 要注意

5)我实在搞不懂1755 nlogn为啥会在少判断的情况下tle 可能使垂直的线 在极角排序时的k引入了问题

 但实在不好解决 以后在效率足够的情况下 尽量避免用nlogn

明天任务:

看到了半平面交 最后一个推荐题目

Poj 2540 做法应该是中垂线的线性规划区域 明天写一下

明天有时间 就再开第五部分了 是扫描线一类的东西

时间: 2024-10-15 10:05:32

计算几何学习5的相关文章

计算几何学习1

目前在跟着这个题目列表 来学习, 目前进行了一中的大部分,模板是参考唐天晓学长的板子和白书来搞的. 学习的内容: 1.复数类的一些常用操作 typedef complex <double> Point;// 复数类来简化代码 Point a; a.real(), a.imag();// a的实部与虚部 对应二维平面 x,y abs(a);// 向量a的模/a到原点距离 norm(a);// 模的平方 arg(a);// a对应的角度 (弧度制 conj(a);// a的共轭 (来计算点积与叉积

计算几何学习8

由于poj炸了 而题单上有很多poj的题 就先开始第二部分了 学习了两个固定算法 最小圆覆盖和平面上最近点对 平面上最近点对采用的是分治的思想 把一个x有序的序列分成A,B左右两部分 当得到A内最近点对距离,B类最近点对距离后 先更新大序列的答案ans A,B间最近点对的产生 显然在x坐标距离mid点不超过ans的区间内产生 我们把这段区间拿出来,对y排序 再逐对更新 值得注意的地方 1)为了确保速度 可以在第二次对y排序的时候采取对标号排序的方式 2)在枚举点对更新的时候注意在y差值 >= a

计算几何学习6

周末搞完了扫描线的部分 上次说的半平面交问题做法是没问题的 是按照中垂线划分平面 再求核的面积 因为是每加入一个直线就判断 所以n^2的好一点 扫描线板子(poj1177 周长并) #include <cstdio> #include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #define lc(x) (x << 1) #define

计算几何学习4

今天完成的内容很少 学习了一点半平面交 n^2的做法还是很平易近人 刚开始初始化一个大有界的平面 依次用每条直线去切割平面即可 原有的点如果在当前直线左侧一定会被保留 而原有多边形的线段 可能会在线段中间出现交点 在判断一下即可 不想加入重复的点 就在交点求出后判断一下 模板题 因为没注意题目的读入顺序可能顺时针可能逆时针 并且多边形也不一定凸 调了很久 其实 n^2的 HPI部分没错的 至于nlogn的照着板子敲了一发 WA了 刘汝佳老师板子很简洁 但是排序很迷 说是直线的极角排序 但没给重载

计算几何学习12 + 组队训练

学习了极角排序的一些套路 UVA11696 给你一些圆和一些点,保证点不在圆内,两点相连通当且仅当两点联结的线段不与任何一个圆相交,问联通块个数 跟之前那道UVA很类似 其实更加简单 枚举每个点 把其他所有点和圆对他极角排序 用set维护圆到当前点的切线的最短距离 因为点不在圆内 所以直接判断距离就行了 poj 2280 给你一些A类点 B类点 寻找一条直线 使得线上的点和直线左侧的A类点 直线右侧的B类点数目之和最大 首先可以知道直线一定从 给定两点的连线中产生 所以考虑枚举点 让其他点对他极

计算几何学习3

完成了题表中的前三部分 (由于二.三部分的内容比较少 一. poj 2826 用两条木板来盛雨水 问能接到多少 线段交 分类讨论 1)只要有一条水平 就不能盛水 2)没有交点 不能盛水 3)有交点 但是交点水平上方 没有分别两个端点不能盛水 4)*有两个端点 但是上侧长的一根覆盖了另一条短的 不能盛水 如果都能满足 就利用交点 算一个三角形面积即可 **学习到最后输出浮点数可以 ans + eps 防止出现 - 0.000的情况 或者需要特判一发 poj 3347 给出一种放置正方形序列的方式(

计算几何学习7

今天搞的都是一些简单的解析几何 有一些东西有固定的求法 求角平分线:先通过角的两边算出角度 再旋转其中一个至角平分线的位置 求垂线:直接通过方向向量求出直线的法向量 三角形的三个心: 外心:两个中垂线交点(三角形外接圆就是外心) 内心:两个角平分线交点 垂心:垂线交点(一个顶点在对边法向量上的直线) 圆的切线:点到圆心的直线 旋转一个角度 可以通过半径和到圆心的距离算 求球面距离:习惯通过球坐标系求出两个点直角坐标系中的方向向量 然后通过点积算出圆心角 再乘上球的半径 今天做的都是这些加上一点变

【笔记篇】最良心的计算几何学习笔记(三)

广告: 先是放一下本文的::github传送门:: (不知道为什么要放) 今天发现了一个AMA(Ask me anything)的东西, 觉得非常好玩, 就fork了一个放到自己的github里面, 估计没有人会来问, 所以就放到这里拉拢人气(虽然这里也拉拢不到) 欢迎大家来玩哦~ 地址请戳这个就是传送门啦~ 今天继续计算几何(明明已经颓废了半下午了 计算多边形面积 我们先从最简单的多边形--三角形开始看. 如何计算\(\triangle ABC\)的面积? 这个问题数学课上老师应该说过.. \

【笔记篇】最良心的计算几何学习笔记(六)

半平面交 github传送门 简介 Emmmm学完旋转卡壳感觉自己已经是个废人了.. 修整了一个周末, 回来接着跟计算几何势力硬干... (这个周末是不是有点长?) 今天就讲讲半平面交吧. 请自己回顾必修五 线性规划相关知识... 什么是半平面? 就是一条直线一侧的点构成的集合.. 用解析几何的观点来看就是满足\(Ax+By+C<0\)这个不等式的点的集合. 那么半平面交自然就是许多这样的集合的交集咯~ 最后就很像线性规划做出来的可行域一样... 半平面交可以长这样 这样 甚至这样 也就是说,