随笔分类 - 计算几何
我爱数学
摘要:ps:D题挂了,最后只有三个。。。。E题是赛后看着一群大神的代码YY的(网上找不到题解,好奇怪,肿么都没人写的)之所以这么迟是因为一直在纠结E题A:如果第一个人能放,那就放在中间的位置,然后第二个人不管放哪第一个人总有对称的放法B:水题C:简单贪心,错了一次D:给你一幅图,假如在地板上铺上无限的同样的图,判断从S出发能否走到无限远的地方只需要判断能否从一幅图的一个点走到相对位置相同的另一幅图中的那个点即可,通过取余来表示无限幅地图E:给你一棵树,然后又给你坐标图上的n个点,让你按照树的构成将坐标连接起来,即给所有的坐标点一个编号,将树种的点与坐标对应起来树中相交的边 在坐标中体现 的线段也相交
阅读全文
摘要:A题:模拟题,仔细点就好B题:DP给你一个数字矩阵,要求从左上角走到右下角的一条路径,这条路径上的数乘起来后末尾的0的个数最少末尾的0是由2、5产生的,于是联想一下是不是走2最少的一条路或者5最少的一条路就ok了呢?嗯,就是ok的.*_*假设从左上角走到右下角走过的数含因子2的最小的个数是x,5的最小的个数是y,则答案是min(x,y),即最优解x、y的个数中有一项是最少的证明:用反证法,假设最优解经过的数含a个2,b个5,a>x,b>y,易得答案肯定大于min(x,y),所以最优解的x、y肯定有一项是最小的View Code #include<cstdio>#incl
阅读全文
摘要:有一个连通器,由两个漏斗组成,倒vol提及的水,问你连通器中水的高度是多少解法:先求出水面可以到达的最低和最高的高度,然后二分答案判断View Code #include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const double eps = 1e-8;const int maxn = 1010;const double inf = 1000000000;int n,m;double vol,miny,maxy,ans;str
阅读全文
摘要:求出所有的交点,去重,如果是警察点,就不放入点集再把不在线段交点上的警察点加入点集,排序由于一个点只能和同一线段上相邻的点连边,所以枚举每条直线,相邻的点如果不是警察,建边最后bfs判断能否搜到即可View Code #include <math.h>#include <cstdio>#include <vector>#include <queue>#include<algorithm>using namespace std;const int maxn = 10001;const double eps = 1e-8;inline d
阅读全文
摘要:上图使用来描述直线向内推进r这一过程的ac=r,ae是推进前的直线上的两点,现在求c、f的坐标,由上可得三角形ace 与三角形abd相似,所以很快便可求出ab 的距离,即x坐标的移动距离,延长de,从f向其做垂线,连接fd,便又可以由三角形相似求得y坐标的移动距离下面是两道半平面交向内推进r的例子http://poj.org/problem?id=3525http://poj.org/problem?id=3384主要讲讲3384先用3525的方法向内推进r求出一个内核,则可知这个核上的任何一点都可以成为圆心坐标,要使的两个圆的重叠面积尽可能小,就要使他们的圆心坐标尽可能的远,素以可以选取内核
阅读全文
摘要:半平面交的模板O(n^2)在http://www.cnblogs.com/wuyiqi/archive/2012/03/30/2426175.html题意:判断在一个正方形上切出题目要求的凸多边形的最短切痕总和总共才8条边,数据规模不大,时限10s,直接暴力枚举切割的顺序,然后计算这是我第一次接触平面切割,也可以算是处女割了吧,呵呵View Code #include <cmath>#include <cstdio>#include<algorithm>using namespace std;const int maxn = 100;const double
阅读全文
摘要:今天学了学半平面交,其实很简单的,我说的是最原始的思想,复杂度是O(n^2)的相当于中学的时候学的线性规划,用n条直线去切割一个平面,每条直线代表一定的限制,最后如果有解就会在中间留下一个凸核这个凸核中的点就是满足所有的约束条件的解集典型的例子 :给你一个多边形,判断多边形内是否存在一个点,从这个点可以看到多边形周围所有的点做法:多边形的每条边都是一个约束条件,边的顺序为顺时针用每条边的直线去切割当前平面:枚举平面点集中的点,假如当前点(p)在核外,判断p-1与p+1是不是在核内,如果是,则肯定有交点分别把求出的交点加入点集不断重复的做下去最后点集中的点就是要求的的可行解下面是我的模板,自己看
阅读全文
摘要:今天又切了一题,做题的同时当然也验证了各种模板每次都感觉有所改进View Code #include <math.h>#include <cstdio>#include<algorithm>using namespace std;const int maxn = 100010;const double eps = 1e-8;inline int max(int x,int y){return x>y?x:y;}inline double max(double x,double y) {return x>y?x:y;}inline double m
阅读全文
摘要:收获不错:线段 、 直线相交神马的更加熟练了,一些细节的处理也加强了给你一个多边形,一条直线,注意,是一条直线,判断这条直线在多边形内部的长度的总和做法很明确,求出所有的交点,按一个方向排序,相邻两个点之间的线段肯定要么全部在多边形内,要么全部不在多边形内,所以只要判断两点间的中点在不在多边形内就可以了这道题目值得注意的是:在求直线与线段交点的时候,先判断一下直线能否与线段相交,再求交点,可以节省很多计算量,不这么做可能就超时了献上我的一大坨代码View Code #include <math.h>#include <cstdio>#include<algorit
阅读全文
摘要:zoj 2419 poj 2079 求点集中面积最大的三角形网上很多的做法都是暴力枚举的,数据太水了才会过,下面的做法是O(n)的,但是没有严格的证明先枚举一条边(i,j),再枚举一个点k,让点k一直跑,跑到最远为止。(凸包的单调性)固定边( i ,k),枚举j,。。。。。。。。。。。。。。。。固定(j、k),。。。。。。。。。。。。。。。。。。。。。。。注意每一次旋转结束后需要更新面积的最大值(如果能更新)如果一次下来 i,j,k都在原来的地方没有动过,就让k往后挪一个位置直到k到了第一个点程序终止View Code #include <math.h>#include <c
阅读全文
摘要:View Code const int maxn = 100000;const double eps = 1e-8;const double pi = acos(-1.0);#define sgn(x) (fabs(x)<eps?0:(x>0?1:-1))struct Point { double x, y; Point(double a=0,double b=0){x=a;y=b;} Point operator - (const Point& t) const { Point tmp; tmp.x = x - t.x; tmp...
阅读全文
摘要:主要内容是计算几何,利用了一个图论中的结论平面的区域个数 r=m-n+2,m为边数、n为点数心血来潮,决定不用别人的模板,手写了模板1:判断线段相交2:判断点在线段上都是些最基本的,不过这些以后就算我自己的啦,用别人的总感觉怪怪的View Code #include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const int maxn = 100000;const double eps = 1e-8;const double
阅读全文
摘要:判断一个多边形能否放进凸包中对所有点再做一次凸包,把重点和共线点都加进凸包集合中如果图暴集合中有某个点是多边形的点就输出noelse yesView Code #include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;typedef __int64 lld;const double eps = 1e-8;const double pi = acos(-1.0);struct Point { lld x, y; int id;
阅读全文
摘要:简单二分枚举求圆的面积交View Code #include<cstdio>#include<cmath>const double eps = 1e-8;const double pi = acos(-1.0);struct Point{ double x,y;}p[1000];struct circle{ Point pp; double r;}cir[30];double area[30];int n;double cir_area_inst(Point c1, double r1, Point c2, double r2) { // 两圆面积交 ...
阅读全文
摘要:毫无疑问,最远点对肯定都在土包上所以可以先求凸包再两两枚举土包上的点这时候的点会比原先情况下少很多凸包用的是快速土包法这种方法在有些时候会退化成N^2英文例子:http://www.cs.princeton.edu/courses/archive/spr10/cos226/demo/ah/QuickHull.html大牛博客:http://www.cnblogs.com/Booble/archive/2011/03/10/1980089.htmlView Code //快速土包算法,递归#include <iostream>#include <math.h>#defin
阅读全文
摘要:偶尔逛到这题,是2011年世界总决赛的题目,怀着一丝敬畏和期待开始看这道题目二维平面内一个多边形,可以任意旋转,使得可以将其扔进一个宽为w的槽,求w的最小值idea:开始的时候随便画了画草图,假设最后最优的情况是两个点分别在槽的两边,则一定可以绕其中的一个点旋转一个角度使得产生空隙(纸上画一画就知道了),此时的答案应该更小才是,进一步可以发现一定能够将一条边转到槽的便上,所以,有方案了。先求土包,枚举土包上的每条边,再枚举每个土包上的点,求出最大的距离,这些最大距离的最小值就是我们要的答案可惜没有1A....没有判断n为0的时候停止。。囧!View Code #include<stdio
阅读全文
摘要:真想知道那些几百ms的是怎么写的View Code #include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>using namespace std;struct point { double x,y;}p[100010],q[100010];double ans;inline double dis(point a,point b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}inline doubl
阅读全文
摘要:还是跟那题poj 1379 run away一样的做法http://www.cnblogs.com/wuyiqi/archive/2011/12/08/2280885.html改一下最优的方法(到n个点的距离之和)就好了View Code //求n边形的费马点//即找到一个点使得这个点到n个点的距离之和最小#include<stdio.h>#include<math.h>#include<stdlib.h>#include<time.h>const double inf = 1e10;const double pi = acos(-1.0);co
阅读全文
摘要:两个题目一个是求一个点,使得该点到n个点的最大距离的最小值另一个是求一个点,使得该点到n个点的最小距离的最大值好像也不是什么模拟退火的做法,只是一种利用随机函数的做法,遍历一下整个区域找到最优解poj 1379View Code //在某个区域内到某个点集的最小距离最大//随机算法解决//dis[i]表示点i到点集中最小距离的最大值#include<stdio.h>#include<math.h>#include<stdlib.h>#include<time.h>const double inf = 1e10;const double pi =
阅读全文
摘要:找出一个点使得这个店到n个点的最长距离最短,即求最小覆盖圆的半径用一个点往各个方向扩展,如果结果更优,则继续以当前步长扩展,否则缩小步长View Code #include<stdio.h>#include<math.h>#include<string.h>const double pi = acos(-1.0);struct point { double x,y;}p[1010];int n;point mid,tmid;double R,xmin,ymin,xmax,ymax;double ans,tans;double dis(point a, poi
阅读全文