
计算几何2D
文章平均质量分 73
incredible_bly
这个作者很懒,什么都没留下…
展开
-
计算几何专项:UVa 11646
周长公式为2*L+acos((L*L-W*W)/(L*L+W*W))*sqrt(L*L+W*W)。然后二分L或者W就行了。#include #include #include #include #include using namespace std;const double pi=3.14159265;const double eps=1e-10;double a,b;in原创 2013-03-15 23:14:37 · 577 阅读 · 0 评论 -
计算几何专项:UVa 10969
这道题和训练指南上的例题LA2572几乎一样,唯一不同的是只是求可见的周长。具体就是把所有的圆分成一段一段的圆弧(用圆弧的中点代表圆弧),然后看圆上的每一段圆弧是否在顶部,具体的判别方法需要一些技巧,因为精度问题在这上面WA了一次。具体参见代码吧。#include #include #include #include #include using namespace std;#原创 2013-04-24 19:04:48 · 729 阅读 · 0 评论 -
计算几何专项:UVa 10556
刚开始用double类型做,就是先把第一个多边形上一个点位移到另一个多边形的对应点处,然后再旋转和位移。然后果断因为精度问题WA了。。。然后改成整形,推一遍公式就AC了。恩,以后不管什么类型的题,能化整形就尽量化成整形,以避免不必要的精度问题。#include #include #include using namespace std;struct point{ int x,原创 2013-04-19 22:24:55 · 581 阅读 · 0 评论 -
计算几何专项:UVa 10585
不难得出若点集对称,则y轴坐标最大与最小的点互为对称点,对称中心即这两点的中点。然后n^2枚举所有点就行了。#include #include #include using namespace std;#define M 10010const int inf=1<<30;int x[M],y[M];int vis[M];int n;int main(){ freop原创 2013-04-19 22:27:38 · 653 阅读 · 0 评论 -
计算几何专项:UVa 811
枚举砍掉的树的集合,然后对未砍树做一次凸包,求出凸包的周长与砍掉树所能做出的fence长度进行比较即可。#include #include #include #include #include using namespace std;const double eps=1e-6;int dcmp(double x){ if(fabs(x)<eps) return 0;原创 2013-05-15 21:18:43 · 571 阅读 · 0 评论 -
计算几何专项:UVa 588
一道半平面交,用朴素的O(n^2)方法就可以过,需要注意平面退化成点或者线段的情况,在这样的情况下,仍然是possible的。#include #include #include #include using namespace std;const double eps=1e-6;const double inf=1e20;int dcmp(double x){ if(原创 2013-06-02 12:36:09 · 471 阅读 · 0 评论 -
计算几何专项:LA 2453
先求一遍凸包,然后根据凸包就可以求出所求的围墙长度了。具体的方法就是凸包周长加上每个顶点构成的一段以L为半径的圆弧。至于最后的精度问题,只要四舍五入就可以了。#include #include #include #include #include using namespace std;const double eps=1e-6;const double pi=acos(-1.0原创 2013-06-24 23:26:17 · 552 阅读 · 0 评论 -
计算几何专项:UVa 754
就是将把外围的四条边分割,然后取每段的中点与treasure相连,求出其中所交wall的数量最少的即可。#include #include #include #include #include #include using namespace std;const double eps=1e-6;int corner[4][2]={{0,0},{0,100},{100,0},{1原创 2013-06-28 22:35:32 · 612 阅读 · 0 评论 -
计算几何专项:UVa 11265
一道半平面交,这里不能用朴素的切割的方法。直接爆内存了……需要用类似凸包的方法,可以用训练指南上的模板。唯一需要注意的是判断半平面切割的方向。#include #include #include #include #include using namespace std;const double eps=1e-7;int dcmp(double x){ if(fab原创 2013-06-29 22:58:30 · 580 阅读 · 0 评论 -
计算几何专项:UVa 10084
一道半平面交,切割线为2点的中垂线。然后根据colder、hotter来判断切割的方向。这里用切割多边形的方法求半平面交即可。#include #include #include #include #include using namespace std;const double eps=1e-6;int dcmp(double x){ if(fabs(x)<eps)原创 2013-07-02 23:29:48 · 663 阅读 · 0 评论 -
计算几何专项:UVa 12307
应用旋转卡壳求最小面积外接矩阵和最小周长外接矩阵,在网上找到了实现策略,可是不会自己实现。参考了别人的代码,搞了一上午把细节搞懂了,奉上AC代码。#include #include #include #include #include using namespace std;const double eps=1e-6;const double inf=1e10;int dcmp原创 2013-07-04 23:21:22 · 1533 阅读 · 0 评论 -
计算几何专项:UVa 11072
一道纯的模板,就是先求一个凸包,然后再判断点是否在凸包内。需要注意给定点与凸包顶点重合的情况(样例里就有这样的情况,恩,样例还是给了提示的)。#include #include #include #include #include using namespace std;#define M 100010struct point{ int x,y; point(i原创 2013-04-26 21:51:40 · 1017 阅读 · 0 评论 -
计算几何专项:UVa 10245
一上来除了暴力完全没有想法,后来去搜了题解才知道还有一种叫做“平面最近点对”的东西,其核心思想就是分治。感觉机理和线段树有点像,就是把区间拆分求解,然后再合并的过程,时间复杂度为O(nlogn)。比较难以想到的是怎么把两个区间合并,说白了就是利用两点间的最短距离大于其横坐标之差。具体的看代码吧,如果实在不懂可以google相关题解。#include #include #include原创 2013-04-26 21:50:34 · 556 阅读 · 0 评论 -
计算几何专项:UVa 11817
给出经纬度求球面坐标的模板题。#include #include #include #include #include using namespace std;const double R=6371009.0;double torad(double deg){ return deg/180*acos(-1.0);}int main(){ freopen("原创 2013-03-15 23:17:28 · 624 阅读 · 0 评论 -
计算几何专项:UVa 10566
本来想推公式,结果推了半天都没推出来。然后一转思路,二分w的长度,一会就A了。不难计算出交点离地面的距离:h=sqrt(x*x-w*w)*sqrt(y*y-w*w)/(sqrt(x*x-w*w)+sqrt(y*y-w*w),然后与c比较就行了。#include #include #include #include #include #include using namespac原创 2013-03-17 00:05:12 · 613 阅读 · 0 评论 -
计算几何专项:UVa 11437
求出r、p、q,然后求叉积,取绝对值再除以2就行了。第一次感受到lrj书上模板的威力,感觉好神奇!#include #include #include #include #include using namespace std;struct point{ double x,y; point(double x=0,double y=0):x(x),y(y){}};原创 2013-03-15 23:11:26 · 592 阅读 · 0 评论 -
计算几何专项:UVa 11524
算出公式即可求解。AB=(m1+n1)*n3/(m3+n3)/m1*AC;BC=(m2+n2)*m3/(m3+n3)/n2。角B=acos(AB^2+BC^2-AC^2)/(2*AB*BC)。然后利用内切圆的性质就很容易求解出面积了。#include #include #include #include #include using namespace std;doub原创 2013-03-15 23:20:09 · 895 阅读 · 0 评论 -
计算几何专项:UVa 11186
这道题直接暴力枚举,把所有三角形的面积加起来就行了。#include #include #include #include #include #include using namespace std;const double pi=2*acos(0.0);int n;double r;struct point{ double x,y; point(doub原创 2013-03-17 21:42:22 · 902 阅读 · 0 评论 -
计算几何专项:UVa 12300
就是求n多边形上两点的最远距离,容易推出相隔最远的必为中间隔着n/2-1个顶点的两顶点间的距离,然后运用余弦定理就可以求出多边形中心到顶点的距离,进而得出多边形的面积。#include #include #include #include #include using namespace std;int main(){ freopen("in.txt","r",stdin原创 2013-04-04 23:03:05 · 687 阅读 · 0 评论 -
计算几何专项:UVa 10439
易知3个点连线的中垂线的交点即为正多边形的中心,同时正n边形上点与中心连线的夹角为2*pi/n的整数倍,因为正多边形最多只有200个顶点,所以暴力即可。这道题精度不能弄得太高,我用1e-6连样例都过不了,改成1e-4就AC了。#include #include #include #include #include using namespace std;const double原创 2013-04-04 23:02:04 · 677 阅读 · 0 评论 -
计算几何专项:UVa 12301
由角a、b、c、d、e可以确定三角形ABC的形状,所以不妨以A为原点,AB为x轴建立直角坐标系。然后求出D、E的坐标,然后在三角形ADE中运用余弦定理就可以求出结果了。#include #include #include #include #include using namespace std;const double eps=1e-8;int dcmp(double x){原创 2013-04-05 22:10:40 · 650 阅读 · 0 评论 -
计算几何专项:UVa 10522
运用海伦公式可以推出三角形面积的公式为1/sqrt((1/ha+1/hb+1/hc)*(1/ha+1/hb-1/hc)*(1/ha+1/hc-1/hb)*(1/hb+1/hc-1/ha))。在判断是否能构成三角形的时候需要注意边为0和负的时候的情况。#include #include #include #include #include using namespace std原创 2013-03-22 23:12:12 · 546 阅读 · 0 评论 -
计算几何专项:UVa 10674
一道求两圆切线的模拟题,因为排序的时候没有考虑精度问题,贡献了一WA。#include #include #include #include #include #include using namespace std;const double eps=1e-8;const double pi=acos(-1.0);int dcmp(double x){ if(fab原创 2013-03-26 22:40:33 · 832 阅读 · 0 评论 -
几何专项2D:POJ 2318
许久不做几何,完全不会了。刚开始O(n^2)纯暴力,妥妥地T了……其实只要利用叉积的性质,判断该点在隔板的左边还是右边,然后二分答案即可。#include #include #include using namespace std;const int maxn=5010;struct point{ int x,y; point(int x=0,int y=0):原创 2013-11-08 11:26:45 · 653 阅读 · 0 评论