
ACM-几何
路小白_zZ
这个作者很懒,什么都没留下…
展开
-
hdu 5120(几何+容斥)
题意:给出两个相同的环的小半径r和大半径R,然后给出两个环的圆心坐标,问两个环的重叠面积。 题解:按圆心距与半径的关系分四种情况,容斥+求两圆重叠面积模板。#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <cmath>using namespace std;const do原创 2015-10-28 16:50:14 · 458 阅读 · 0 评论 -
uvalive 2402
题意:一个正方形,左下角坐标(0,0),右上角坐标(1,1),4条边上各有n个点,4个边的点的名字ai,bi,ci,di。对于每个i,连接两条线段(ai,0)-(bi,1)和(0,ci)-(1,di),可以把正方形分成若干部分。问划分成的最大块的面积。 题解:直接按读入的点切割多边形,没什么坑点。#include <cstdio>#include <cstring>#include <cmat原创 2015-08-03 19:57:57 · 481 阅读 · 0 评论 -
uva 11186
题意:给出一个圆的半径r,默认圆心在(0,0),圆上的有n个点,给出每个点从x正半轴移到对应位置的角度(0~360),没有三点共线情况,任意三个点都可以组成一个三角形,问这些三角形的总面积。 题解:用了三层for暴力枚举三个点,然后面积用叉积计算,水过去了。大神是用容斥做的,这里讲的不错:http://blog.youkuaiyun.com/shimmer_/article/details/38613079。原创 2015-08-02 23:40:40 · 917 阅读 · 0 评论 -
uva 11731(旁切圆)
题意:给出一个三角形ABC的三条边长,求DEF的面积和阴影部分总面积。 题解:三角形内部的圆是内切圆,而外面的三个圆是旁切圆,关于旁切圆有一个性质就是他的圆心是三角形两个外角的角平分线(举栗子:AF和BF)和一条内角平分线的交点,由此可以推出∠EAC == ∠FAB,∠FBA == ∠CBD,∠BCD == ∠ACE。 然后可以推导出下列三个式子: ∠EAC + ∠E + ∠ACE = 1原创 2015-08-03 10:19:18 · 1222 阅读 · 0 评论 -
uva 12300
题意:给定两个点A和B,求穿过这两个点的面积最小的正n边形的面积。 题解:画图就能推断,AB连线一定是n边形第0个点和第n/2个点的连线,因为这条连线是正n边形最长的一条边,这样面积才能最小,正n边形的面积 S = 边心距 * 周长 / 2。#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>usin原创 2015-08-02 15:54:16 · 562 阅读 · 0 评论 -
uvalive 4413(梅涅劳斯定理)
题意:如图所示,给出P、Q、R三点的坐标,AB、BC、AC被点F、D、E划分成m1:m2、m3:m4、m5:m6,给出m1~m6的数值,求△ABC的三个顶点A、B、C的坐标。 题解:根据梅涅劳斯定理,如果有两个三角形是这样组成的: 结论:(BD/DC)×(CE/EA)×(AF/FB)=1 证明省略,直接运用结论,在题中所给的三角形中有6组这样的三角形,分别可以推出后面两个边的比值: △CBQ原创 2015-08-03 15:31:55 · 970 阅读 · 0 评论 -
uva 11524
题意:三角形的内切圆把每条边分成m1:n1,m2:n2,m3:n3的比例,给出m1,n1,m2,n2,m3,n3的值和内切圆的半径,问三角形面积。 题解:a, b, c是三边长度 已知三角形面积 S = 1/2 * a * r + 1/2 * b * r + 1/2 * c * r 海伦公式计算面积 S = sqrt(p * (p - a) * (p - b) * (p - c)) 其中 p原创 2015-08-02 11:54:31 · 675 阅读 · 0 评论 -
uva 10566
题意:两栋楼间有两个斜放的梯子,斜放的梯子的交点的高是c,两个梯子的长度是x和y,问楼的间距。 题解:设交点到左边楼的距离是a,交点到右边楼的距离就是 间距 - a,根据相似三角形的性质: c / sqrt(x * x - 间距 * 间距) = (间距 - a) / 间距 c / sqrt(y * y - 间距 * 间距) = a / 间距 那么这两个式子相加,就可以得出 c / sqrt原创 2015-08-02 18:10:58 · 532 阅读 · 0 评论 -
uvalive 4986(三分查找)
题意:空间内有n个点,求一个最小体积的圆锥把所有点包进去。输出圆锥的高和底面半径。圆锥的底面圆心在(0,0),所有点的z坐标都大于等于0。 题解:因为圆锥体积是 V = 1/3 * π * r^2 * h ,这是一个二次函数,也就是个凸性函数,可以用三分查找的方式枚举两个高,然后找到对应的最小的r,比对两个高得到的体积继续三分查找。#include <cstdio>#include <cstri原创 2015-08-01 23:04:09 · 684 阅读 · 0 评论 -
uva 11800
题意:给出一个平面上四个点的坐标,问判断这四个点能组成怎样的四边形,按正方形,矩形,菱形,平行四边形,梯形,普通四边形的顺序判断并输出。 题解:先用凸包把四个点排好序,然后依次判断。#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const double原创 2015-08-01 15:37:27 · 469 阅读 · 0 评论 -
uva 10969
题意:平面上依次放置n个圆,后放的覆盖先放的,按顺序给出每个圆的半径和圆心坐标,问最后图形的可见圆弧长之和。 题解:因为是后放的覆盖先放的,所以逆序枚举,每个圆只考虑之前放过的圆和自己的交点,可以得到每两个相邻的交点之间的圆弧,找到圆弧中点,如果这个点在之前放过的圆内,说明这个圆弧不能要,否则加到答案里。#include <cstdio>#include <cstring>#include <原创 2015-08-04 00:02:59 · 1012 阅读 · 0 评论 -
uvalive 4992(半平面交+二分)
题意:丛林里有n个瞭望塔,组成了一个凸多边形,瞭望塔可以保护这个凸多边形内的任意一点,总部就设在凸多边形内的某一点,敌人会炸掉瞭望塔使总部不再被剩下的塔监视到,现在要选择一个最优的总部位置,输出敌人需要炸毁的瞭望塔的数目。 题解:二分出需要炸的数目然后把剩下的塔拿去半平面交看是否还有交集,可以想到如果有两颗炸弹,敌人会选择连续的两个顶点炸,因为这样损失的面积更大(梯形面积大于三角形。。。),然后我原创 2015-07-29 19:49:35 · 658 阅读 · 0 评论 -
lightoj 1285(凸包)
题意:有n个点,要求每个点都要是凸多边形的一个顶点,且边不交叉,每个点只有两条边和他相连,要求顺序输出凸多边形的形状也就是各个顶点的编号,不存在就输出Impossible。 题解:首先容易想到Impossible的情况只有n点共线时会出现,用凸包函数求出凸包后,如果少于3个点就是Impossible。特判后,再用一次凸包,这次求凸包要包括共线点,下凸包的点是答案数组的前半部分。然后把所有点(不是只原创 2015-11-07 20:38:55 · 837 阅读 · 0 评论 -
hdu 5130(圆和凸多边形相交面积)
题意:有一个简单的多边形,也就是凸多边形,现在有两个点A和B,问凸多边形上的点P,P到B的距离不超过P到A的距离的K倍,满足条件的P的区域的面积是多少。 题解:可以想到式子PA * K >= PB,这道题关键点在于这个式子可以化简成圆的一般式,因为K < 1,那结果就是圆和凸多边形的相交面积。。。 圆的一般式:x^2 + y^2 + Dx + Ey + F = 0 圆的标准方程:(x - a)原创 2015-11-06 18:19:25 · 1155 阅读 · 0 评论 -
lightoj 1203(凸包)
题意:有n个点,问从哪个点用最小的角度可以看到其他所有的点,输出最小角度。 题解:把n个点求凸包,凸包内部的点角度都是360,所以结果就是凸包的最小内角。#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <cmath>using namespace std;const dou原创 2015-11-07 20:29:26 · 769 阅读 · 0 评论 -
poj 3335(半平面交)
题意:顺时针给出n个点的凸多边形,问凸多边形的内核。 题解:半平面交模板题,有点坑,用大白上的模板时,判断点是否在有向直线的左边,线上的也算。。#include <cstdio>#include <cstring>#include <cmath>#include <vector>#include <algorithm>using namespace std;const double e原创 2015-11-07 00:41:12 · 574 阅读 · 0 评论 -
uva 12307(点集的外接矩形)
题意:平面上有n个点,要求求出包含所有点的矩形的最小面积和最小周长。 题解:先求点集的凸包,然后把凸包的每条边当做底边,把其他左、上、右三边根据底边用旋转卡壳的方式确定,计算长宽更新最小值。做了这题后对旋转卡壳理解更深刻了。#include <cstdio>#include <cstring>#include <cmath>#include <vector>#include <algori原创 2015-08-06 21:16:38 · 1017 阅读 · 0 评论 -
uva 10084
题意:在一个矩形空间内,左下角坐标(0,0),右上角坐标(10,10),然后两个小孩子玩游戏,乙让甲猜一个物体的位置,初始必须猜(0,0),然后之后甲说出的位置,乙都会根据上一次猜的位置和这一次猜的位置距离正确位置的远近给出一个答案,Colder说明这次猜远了,Hotter说明猜近了,Same说明猜的是正确位置。输出每次询问后,所有可能位置占的总面积。 题解:用切割多边形的方式求半平面交多边形面积原创 2015-08-06 13:26:39 · 619 阅读 · 0 评论 -
uvalive 2453
题意:有一个n边形的城堡,在外围造一个总长度尽量小的围墙,使得任何一部分离城堡的距离不小于L,输出围墙长度。 题解:先把n个点求凸包,然后围墙一定是凸包的每条边向外扩增距离L,然后每个拐弯的部分是半径为L的圆弧这样总长度才尽量小。#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <原创 2015-08-06 10:26:33 · 473 阅读 · 0 评论 -
uvalive 2512
题意:一个n边形的房间,在里面放一个监控,能看到整个房间,问有多大面积的区域可以放这个监控。 题解:直接半平面交并计算面积就可以了。#include <cstdio>#include <cstring>#include <vector>#include <cmath>#include <algorithm>using namespace std;const double eps = 1原创 2015-08-06 11:00:14 · 592 阅读 · 0 评论 -
uva 11177(凸多边形和圆的相交)
题意:按顺时针或逆时针顺序给出一个凸n边形的n个点的坐标,然后让一个圆心在(0,0)的圆和凸n边形相交的面积大于等于R,问圆的最小半径。 题解:这题简直坑爹啊,各种细节错误。。修修改改了一天,最后看别人题解也还是不懂为什么OnSegment函数要写成那样。。。明明不能判断点是否在线段上 ╮(╯▽╰)╭ 画画图思路不难想到,把凸n边形的每条边都和圆判断关系,如果是边的两点都在圆内,两条边对应一个三原创 2015-08-04 23:54:01 · 1315 阅读 · 0 评论 -
uva 11646
题意:有一个操场,一圈400米,两个弯道是半径相同的圆弧,已知跑道矩形区域的长宽比是a:b,问长宽具体数值。 题解:已知弯道是半径相同的圆弧,那圆心应该在矩形区域对角线的交点,弦长 = 2rsin(n/2),弧长 = nr,n是圆心角,r是半径,那么有这两个公式再加 2ax+2×弧长=400,r = sqrt((ax)^2 * (bx)^2)/2,就可以解出比例x,乘a和b就是具体长宽值。#inc原创 2015-08-01 12:30:41 · 622 阅读 · 0 评论 -
uva 11817(球面距离)
题意:假设地球是一个正球体,半径是6371009米,给出地球上起始点和终止点的经纬度,北纬和东经用正数表示,南纬和西经用负数表示,问沿着球面走的最短路和用隧道走直线路程相差多少。 题解:先把纬度加180,范围转化为0~360,然后把角度转化为弧度,再把经纬度位置转化为空间坐标。x = r * cos(a) * cos(b)y = r * cos(a) * sin(b)z = r * sin(a原创 2015-08-01 16:21:14 · 1020 阅读 · 0 评论 -
uva 11726(凸包)
题意:有n个物品,每个物体不是圆就是k边形,用长度尽量少的绳子把他们围起来,问最短绳子长度。 题解:如果是绳子围起来,那么会出现的就是线段和圆弧,线段可能是多边形上的点组成的,也可能是多边形上的点和圆上的点组成的,也可能是一个圆和另一圆上的点组成,圆上的点组成的是圆弧,所以要做的就是先把多边形上的点加入点集,然后把多边形上的点和所有的圆相切把所有切点找到并加入点集,然后就是圆和圆的外公切线上所有切原创 2015-08-07 17:50:33 · 855 阅读 · 1 评论 -
uvalive 2572
题意:把n个圆盘依次放到桌面上,按放的顺序给出每个圆盘的坐标和半径,问最后多少个圆盘可见。 题解:如果把所有圆盘放好,基本上看到的都是完整的圆盘或者一些圆弧,那么把每一个圆盘和其他圆盘的交点求出来,每两个相邻的交点之间的圆弧也就可以得到,然后把这个圆弧的中点P往内外各移动一个很小的距离,得到P’和P”,把包含这两个点的最顶部的圆盘视为可见。注意很小的距离的取值。#include <cstdio>原创 2015-07-28 13:20:31 · 572 阅读 · 0 评论 -
uva 10256(凸包)
题意:给出n个红点和m个蓝点的坐标,是否存在一条直线,使得取一个红点和一个蓝点都是在直线的异侧。 题解:明显是要判断两个凸包是否有交集,要判断两个凸包的边是否相交,还要判断红点是否在蓝点凸包内部,蓝点是否在红点凸包内部。#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace原创 2015-07-28 18:10:57 · 638 阅读 · 0 评论 -
uva 11168
题意:有n个点,找一条直线,让所有点都在直线的同一侧(也可在直线上),且到直线的距离之和最小。输出距离和与点数的比值。 题解:所有点在直线同侧,也就是直线不能穿过凸包,那么凸包的边所在直线就是可能的解,点(x0,y0)到直线(Ax + By + C = 0)的距离 dis = |Ax0 + By0 + C| / sqrt(A^2 + B^2) 把凸包的每个边拿去计算,所有点到其的距离和,根据计原创 2015-07-28 15:47:30 · 734 阅读 · 0 评论 -
uva 10794
题意:在三维空间内有两架飞机在沿直线飞行,给出两架飞机初始位置和经过T秒后的位置,问从初始位置开始后两架飞机的最近距离。 题解:因为两架飞机飞直线,所以距离差是凸性的,可以用三分来枚举时间计算距离差找到最优解。#include <cstdio>#include <cmath>#include <algorithm>using namespace std;const double eps =原创 2015-08-07 22:56:57 · 483 阅读 · 0 评论 -
uva 11836(两个四面体最短距离)
题意:给出两个四面体的四个顶点坐标(保证四两个面体不相交,且体积大于0),输出两个四面体的最近距离。 题解:要求最近距离分3种情况: 1.顶点到另一个四面体的某面距离 2.顶点到另一个四面体的某条边距离 3.两个四面体的边与边的最短距离(异面线段最短距离) 异面线段最短距离又分两种情况,两条线段所在直线的公垂线的最小距离点对是否都在线段上,如果在那么公垂线的距离就是异面线段最短距离,否则就原创 2015-08-08 17:46:13 · 628 阅读 · 0 评论 -
uva 11796
题意:两只狗分别沿一条折线跑,速度未知,但同时出发同时到达,分别给出两条折线的各点坐标,问两只狗在跑的过程中的最远距离和最近距离差。 题解:如果两只狗跑的都是线段,问题会更容易解决,可以把其中一点当做静止,另一个做相对运动,就可以求出这个过程的最远最近距离,然后如果是走折线,两个点先到拐点的之前的时间段就是前面说的简化过程,也就是把整个过程划分为好多个简化过程阶段。#include <stdio.原创 2015-07-27 00:05:48 · 1161 阅读 · 0 评论 -
uva 12304(圆的相关函数模板)
题意:要求解答6个关于圆的问题。 1.给出三角形坐标求外接圆 2.给出三角形坐标求内切圆 3.给出一个圆心和半径已知的圆,求过点(x,y)的所有和这个圆相切的直线 4.求所有和已知直线相切的过定点(x,y)的已知半径的圆的圆心 5.给出两个不平行的直线,求所有半径为r的同时和这两个直线相切的圆 6.给定两个相离的圆,求出所有和这两个圆外切的半径为r的圆。 题解:花了一天做这个,就当整理原创 2015-07-27 19:46:16 · 1009 阅读 · 0 评论 -
uvalive 3263
题意:平面上有一个包含n个端点的一笔画,第n个端点和第一个端点重合,因此图案是一个闭合曲线,组成的线段可以相交但不重叠,问这些线段将平面切成多少部分。 注意输入的时候输入了n+1个点,最后一个点是起点。 题解:欧拉定理:平面图的顶点数V,边数E,面数F的关系是 V + F - E = 2 有了这个定理,计算一下新增的点(任意两边求交点),然后每个新增的点在现有的线段上就新增一条边,注意点判重。原创 2015-07-26 13:04:33 · 421 阅读 · 0 评论 -
uvalive 3616
题意:给出了空间内的n颗星星的坐标,有m个望远镜,每个望远镜的初始观测点都是(0,0,0),给出每个望远镜的一个截面的圆心坐标和角度,问最多能看到多少个星星。 题解:可以想象出如果望远镜能观测到星星,那么望远镜中轴线和星星两个向量角度差不会超过望远镜本身的角度,所以直接计算角度差判断就可以了。#include <cstdio>#include <cstring>#include <cmath>原创 2015-08-07 20:15:06 · 427 阅读 · 0 评论 -
uvalive 4728(旋转卡壳求凸包最长直径)
题意:有n个正方形,给出了左下角坐标和边长,问在他们的顶点中距离最大的两个点的距离的平方。 题解:首先想到用凸包可以减少点的数量,然后两两枚举比较长度,这种方法也是O(n^2),所以有了一种新的方法叫做旋转卡(qia)壳,http://www.cnblogs.com/Booble/archive/2011/04/03/2004865.html,这里讲的比较好理解。#include <cstdio>原创 2015-07-28 23:11:32 · 577 阅读 · 0 评论 -
uva 11437
题意:给出一个三角形的三点,然后取三边的三等分点和相对的顶点连线,问围起来的三角形的面积。 题解:把CF、AD、BE三个向量先求出来,然后两两取交点,最后用叉积求面积,最后要四舍五入。#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const double原创 2015-08-01 09:38:38 · 892 阅读 · 0 评论 -
uvalive 4973
题意:给出空间两条线段,求他们的最近距离的平方,要用分数形式表示 : l / m两个互质数 其中m>0。 题解:有两种情况,如果两条线段平行或重合,直接计算线段每个端点到另一条线段的距离,取最小值。否则就是异面直线,模板函数带入进行了。。。因为一个变量名坑了一下午加一晚上。。。而且要用数字要用存long long。。。#include <cstdio>#include <cstring>#in原创 2015-07-31 21:26:41 · 567 阅读 · 0 评论 -
uva 11275
题意:三维空间有两个三角形,问两者是否有公共点。 题解:如果相交,三角形的某条边一定经过另一个三角形的内部,边上,或者顶点。#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const double eps = 1e-8;const double PI =原创 2015-07-31 15:41:40 · 450 阅读 · 0 评论 -
uva 12296(切割凸多边形)
题意:有一个长l宽w的矩形,左下角坐标是(0,0),现在有n条线段把这个矩形切割,保证每条线段的两个端点落在矩形不同的边上,把矩形分成了若干区域,现在有m个圆画进矩形,问圆覆盖了哪些区域,并把这些区域的面积排序输出。 题解:先要切割矩形,方法是每读入一条线段都拿去处理切割出的新的区域把原先的区域替换,最后可以得到一个区域的vector,然后判断圆和区域的情况: 1.如果圆没有公共点,可以是圆在某原创 2015-07-31 09:13:55 · 1054 阅读 · 0 评论 -
uvalive 3218
题意:一条封闭折线将平面分成了若干个区域,按顺序给出折线各点的坐标,要求输出封闭折线的轮廓。 题解:用类似卷包裹的算法,先确定一个一定会被选中的点(x坐标最小,y坐标最小)作为起点,然后把可能是下一个极点(凸包顶点)的点都存起来,下一个极点有可能是当前点所在线段的前一个点和后一个点或当前点所在线段和其他线段的有交点的线段的起点和终点。 找出最右侧的点(用角度判断)和当前点的连线是否和其他线段有交原创 2015-07-30 19:47:36 · 774 阅读 · 0 评论 -
uvalive 2797
题意:给出n条线段的左右端点的坐标,然后(0,0)处有一个怪兽,线段成为了他逃脱的障碍,问这个怪兽是否能逃到无穷远处, 题解:用图论的方法把图中u,v连线不和其他线段规范相交的u,v看做连通,最后看起点和终点(坐标很远的一个点)是否是连通的,需要把每条线段都延长一点,因为线段与线段相交的点其实是不能通过的但普通处理方式认为可连通,还有就是如果有公共端点的共线线段,端点不能加到图的结点中。#incl原创 2015-07-30 11:57:06 · 742 阅读 · 0 评论