这几天主要是在打比赛 计算几何写了一些推公式的题
UVALive 4413
相当于按比例 构造出一种小三角形 想求原来的大三角形
这道题用到了 梅涅劳斯定理 链接
简单来说就是一条过三角形三边所在直线的直线 有 AD * BE * CF = BD * CE * AF
证明也比较简单
应用到这题就是由三条直线和三个小三角形得到三个方程 解出来对应比例就可以了
POJ 2208
给你四面体六条边 求体积
欧拉四面体公式 链接
写的时候也并没有用公式 直接建系 也是可以算的
UVA 11524
给你一个未知三角形的内切圆以及它将三角形各边分成的比例 求三角形面积
= =就很气 刚开始的时候求角度算精度出了问题 卡了好久也没成功
后来换了一种做法 假如一边边长为1 则其他边可由比例推出来是多少
记该情况下半周长为 p 而实际半周长为 k * p
由面积比例关系可以得到 k * p * R = k * k * S
S为当前假设的三角形的面积 是sqrt(p * (p - a) * (p - b) * (p - c)) (这里的abc是假设的边长)
可得k = p * R/ S
所以真正的面积是 (p * R) ^ 2 / S
精度确实比较好了。。。
UVALive4714
和上题类似 感觉更简单了 注意寻找等量关系就行 这里用的是大圆和小圆的圆心距
剩下的还有百度之星初赛Round A的 1002
题意大概是 给你n个约束关系 有 x = y , x != y两种
现在把n个约束关系按照顺序划分成k组 每组只有最后一个关系不成立 前面的都成立
问分的组数和每组约束关系的数量 n <= 10 ^5
刚开始很naive 以为 x = y非法时 只有 x != y 其实和加入的集合也有关系了
我们很容易想到并查集维护相等的关系 至于不等关系 在潘学姐的提示下想到启发式
我开了两个set一个存储并查集的集合元素 另一个存储与当前集合有冲突的元素有哪些
在 x != y 时可以直接用并查集判是否成立
在 x = y时 我们遍历较小的集合中的元素 看是否在大集合的冲突集合中出现过
合并时把较小的set插到大的里面去 冲突集合也同样合并
总体复杂度nlog^2n 实际上跑得飞快
最近的感受就是自己代码力欠缺
打百度之星的时候 水题总是敲错 敲的时候很犹豫 敲完也很方 就很难受
在计算几何的精度方面还是模棱两可
拿今天训练的A来说
先是读错题意 以为A B都在圆内 误导了潘学姐和自己 一下子神话了这道题
之后自己发现很简单 开始敲之后 感觉考虑的很全面 手出几组感觉可以 交上去确实WA
就很难受 在WA了几发之后才A
原因是eps设置的太小 改成1e-6才过
其实题目中给出的坐标的范围是有意义的
我后来才是在极限大的数据下发现了 比较的数字比较大 小数后几位可能不准确 才调大了eps
以后的题目在写完时 应该试着出一些比较大的简单数据 看是不是够精度(如果可以出的话
debug时确定算法正确性的情况下 也应该考虑一下用到eps的数字的大小 是比较大还是比较小
接下来想看看圆的反演 和 一些不确定算法和极值的 题目吧