ACM-ICPC培训资料汇编(7)计算几何分册(版本号1.0.0)
ACM程序竞赛计算几何超全模板

/*计算几何目录㈠点的基本运算1. 平面上两点之间距离12. 判断两点是否重合13. 矢量叉乘14. 矢量点乘25. 判断点是否在线段上26. 求一点饶某点旋转后的坐标27. 求矢量夹角2㈡线段及直线的基本运算1. 点与线段的关系32. 求点到线段所在直线垂线的垂足43. 点到线段的最近点44. 点到线段所在直线的距离45. 点到折线集的最近距离46. 判断圆是否在多边形内57. 求矢量夹角余弦58. 求线段之间的夹角59. 判断线段是否相交610.判断线段是否相交但不交在端点处611.求线段所在直线的方程612.求直线的斜率713.求直线的倾斜角714.求点关于某直线的对称点715.判断两条直线是否相交及求直线交点716.判断线段是否相交,如果相交返回交点7㈢多边形常用算法模块1. 判断多边形是否简单多边形82. 检查多边形顶点的凸凹性93. 判断多边形是否凸多边形94. 求多边形面积95. 判断多边形顶点的排列方向,方法一106. 判断多边形顶点的排列方向,方法二107. 射线法判断点是否在多边形内108. 判断点是否在凸多边形内119. 寻找点集的graham算法1210.寻找点集凸包的卷包裹法1311.判断线段是否在多边形内1412.求简单多边形的重心1513.求凸多边形的重心1714.求肯定在给定多边形内的一个点1715.求从多边形外一点出发到该多边形的切线1816.判断多边形的核是否存在19㈣圆的基本运算1 .点是否在圆内202 .求不共线的三点所确定的圆21㈤矩形的基本运算1.已知矩形三点坐标,求第4点坐标22㈥常用算法的描述22㈦补充1.两圆关系:242.判断圆是否在矩形内:243.点到平面的距离:254.点是否在直线同侧:255.镜面反射线:256.矩形包含:267.两圆交点:278.两圆公共面积:289. 圆和直线关系:2910. 内切圆:3011. 求切点:3112. 线段的左右旋:3113.公式:32*//* 需要包含的头文件*/#include <cmath >/* 常用的常量定义*/const double INF = 1E200const double EP = 1E-10const int MAXV = 300const double PI = 3.14159265/* 基本几何结构*/struct POINT{double x;double y;POINT(double a=0, double b=0) { x=a; y=b;} //constructor};struct LINESEG{POINT s;POINT e;LINESEG(POINT a, POINT b) { s=a; e=b;}LINESEG() { }};struct LINE // 直线的解析方程a*x+b*y+c=0 为统一表示,约定a >= 0{double a;double b;double c;LINE(double d1=1, double d2=-1, double d3=0) {a=d1; b=d2; c=d3;}};/*********************** ** 点的基本运算** ***********************/double dist(POINT p1,POINT p2) // 返回两点之间欧氏距离{return( sqrt( (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y) ) );}bool equal_point(POINT p1,POINT p2) // 判断两个点是否重合{return ( (abs(p1.x-p2.x)<EP)&&(abs(p1.y-p2.y)<EP) );}/****************************************************************************** r=multiply(sp,ep,op),得到(sp-op)和(ep-op)的叉积r>0:ep在矢量opsp的逆时针方向;r=0:opspep三点共线;r<0:ep在矢量opsp的顺时针方向******************************************************************************* /double multiply(POINT sp,POINT ep,POINT op){return((sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y));}/*r=dotmultiply(p1,p2,op),得到矢量(p1-op)和(p2-op)的点积,如果两个矢量都非零矢量r<0:两矢量夹角为锐角;r=0:两矢量夹角为直角;r>0:两矢量夹角为钝角******************************************************************************* /double dotmultiply(POINT p1,POINT p2,POINT p0){return ((p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y));}/****************************************************************************** 判断点p是否在线段l上条件:(p在线段l所在的直线上) && (点p在以线段l为对角线的矩形内)******************************************************************************* /bool online(LINESEG l,POINT p){return( (multiply(l.e,p,l.s)==0) &&( ( (p.x-l.s.x)*(p.x-l.e.x)<=0 )&&( (p.y-l.s.y)*(p.y-l.e.y)<=0 ) ) ); }// 返回点p以点o为圆心逆时针旋转alpha(单位:弧度)后所在的位置POINT rotate(POINT o,double alpha,POINT p){POINT tp;p.x-=o.x;p.y-=o.y;tp.x=p.x*cos(alpha)-p.y*sin(alpha)+o.x;tp.y=p.y*cos(alpha)+p.x*sin(alpha)+o.y;return tp;}/* 返回顶角在o点,起始边为os,终止边为oe的夹角(单位:弧度)角度小于pi,返回正值角度大于pi,返回负值可以用于求线段之间的夹角原理:r = dotmultiply(s,e,o) / (dist(o,s)*dist(o,e))r'= multiply(s,e,o)r >= 1 angle = 0;r <= -1 angle = -PI-1<r<1 && r'>0 angle = arccos(r)-1<r<1 && r'<=0 angle = -arccos(r)*/double angle(POINT o,POINT s,POINT e){double cosfi,fi,norm;double dsx = s.x - o.x;double dsy = s.y - o.y;double dex = e.x - o.x;double dey = e.y - o.y;cosfi=dsx*dex+dsy*dey;norm=(dsx*dsx+dsy*dsy)*(dex*dex+dey*dey);cosfi /= sqrt( norm );if (cosfi >= 1.0 ) return 0;if (cosfi <= -1.0 ) return -3.1415926;fi=acos(cosfi);if (dsx*dey-dsy*dex>0) return fi; // 说明矢量os 在矢量oe的顺时针方向return -fi;}/*****************************\* ** 线段及直线的基本运算** *\*****************************//* 判断点与线段的关系,用途很广泛本函数是根据下面的公式写的,P是点C到线段AB所在直线的垂足AC dot ABr = ---------||AB||^2(Cx-Ax)(Bx-Ax) + (Cy-Ay)(By-Ay)= -------------------------------L^2r has the following meaning:r=0 P = Ar=1 P = Br<0 P is on the backward extension of ABr>1 P is on the forward extension of AB0<r<1 P is interior to AB*/double relation(POINT p,LINESEG l){LINESEG tl;tl.s=l.s;tl.e=p;return dotmultiply(tl.e,l.e,l.s)/(dist(l.s,l.e)*dist(l.s,l.e));}// 求点C到线段AB所在直线的垂足PPOINT perpendicular(POINT p,LINESEG l){double r=relation(p,l);POINT tp;tp.x=l.s.x+r*(l.e.x-l.s.x);tp.y=l.s.y+r*(l.e.y-l.s.y);return tp;}/* 求点p到线段l的最短距离,并返回线段上距该点最近的点np注意:np是线段l上到点p最近的点,不一定是垂足*/double ptolinesegdist(POINT p,LINESEG l,POINT &np){double r=relation(p,l);if(r<0){np=l.s;return dist(p,l.s);}if(r>1){np=l.e;return dist(p,l.e);}np=perpendicular(p,l);return dist(p,np);}// 求点p到线段l所在直线的距离,请注意本函数与上个函数的区别double ptoldist(POINT p,LINESEG l){return abs(multiply(p,l.e,l.s))/dist(l.s,l.e);}/* 计算点到折线集的最近距离,并返回最近点.注意:调用的是ptolineseg()函数*/double ptopointset(int vcount,POINT pointset[],POINT p,POINT &q) {int i;double cd=double(INF),td;LINESEG l;POINT tq,cq;for(i=0;i<vcount-1;i++)l.s=pointset[i];l.e=pointset[i+1];td=ptolinesegdist(p,l,tq);if(td<cd){cd=td;cq=tq;}}q=cq;return cd;}/* 判断圆是否在多边形内.ptolineseg()函数的应用2 */bool CircleInsidePolygon(int vcount,POINT center,double radius,POINT polygon[]){POINT q;double d;q.x=0;q.y=0;d=ptopointset(vcount,polygon,center,q);if(d<radius||fabs(d-radius)<EP)return true;elsereturn false;}/* 返回两个矢量l1和l2的夹角的余弦(-1 --- 1)注意:如果想从余弦求夹角的话,注意反余弦函数的定义域是从0到pi */double cosine(LINESEG l1,LINESEG l2){return (((l1.e.x-l1.s.x)*(l2.e.x-l2.s.x) +(l1.e.y-l1.s.y)*(l2.e.y-l2.s.y))/(dist(l1.e,l1.s)*dist(l2.e,l2.s))) );}// 返回线段l1与l2之间的夹角单位:弧度范围(-pi,pi)double lsangle(LINESEG l1,LINESEG l2){POINT o,s,e;o.x=o.y=0;s.x=l1.e.x-l1.s.x;s.y=l1.e.y-l1.s.y;e.x=l2.e.x-l2.s.x;e.y=l2.e.y-l2.s.y;return angle(o,s,e);// 如果线段u和v相交(包括相交在端点处)时,返回true////判断P1P2跨立Q1Q2的依据是:( P1 - Q1 ) ×( Q2 - Q1 ) * ( Q2 - Q1 ) ×( P2 - Q1 ) >= 0。
ACM讲义

ACM讲义 数学) ACM讲义(数学) 讲义(
河南工程学院计算机科学与工程系 郭小波 dvwt@
© ACM程序设计大赛 ACM程序设计大赛
2
ACM:Association for Computing Machinery : 美国计算机协会 ICPC:International Collegiate Programming Contest : 国际大学生程序设计竞赛 ACM/ ICPC 由美国计算机协会主办的国际大学生程序设计竞赛 ACM/ICPC 是世界上公认的历史悠久、规模最大、水平 是世界上公认的历史悠久、规模最大、 最高的国际大学生程序设计竞赛。 最高的国际大学生程序设计竞赛。
© ACM程序设计大赛 ACM程序设计大赛
3
© ACM程序设计大赛 ACM程序设计大赛
4
© ACM程序设计大赛 ACM程序设计大赛
5
学习目的: 学习目的: 通过教学,使学生能掌握ACM竞赛的基本知识 竞赛的基本知识, 通过教学,使学生能掌握ACM竞赛的基本知识,掌握与了 解高级数据结构、离散数学、初等数论、数值计算、计算机 解高级数据结构、离散数学、初等数论、数值计算、 算法、人工智能、时空权衡、图算法、计算几何等等内容。 算法、人工智能、时空权衡、图算法、计算几何等等内容。 并能综合运用这些知识,利用程序语言进行ACM竞赛题目 并能综合运用这些知识,利用程序语言进行ACM竞赛题目 的设计与编写。 的设计与编写。 推荐学习资料: 推荐学习资料: 刘汝佳, 刘汝佳,黄亮 著 ,算法艺术与信息学竞赛 ,清华大学出版 2004年 社 ,2004年1月出版 郭嵩山等著, 国际大学生程序设计竞赛辅导教程》 郭嵩山等著,《国际大学生程序设计竞赛辅导教程》,北京 大学出版社,2001年12月第 月第1 大学出版社,2001年12月第1版 组合数学》 《组合数学》 计算几何》 《计算几何》
计算几何基础_ACM培训课程共67页文档

40、学而不思则罔,思而不学则殆。——孔子
1、不要轻言放弃,否则对不起自己。
2、要冒一次险!整个生命就是一场冒险。走得最远的人,常是愿意 去做,并愿意去冒险的人。“稳妥”之船,从未能从岸边走远。-戴尔.卡耐基。
梦 境
3、人生就像一杯没有加糖的咖啡,喝起来是苦涩的,回味起来却有 久久不会退去的余香。
计算几何基础_ACM培训课程 4、守业的最好办法就是不断的发展。 5、当爱不能完美,我宁愿选择无悔,不管来生多么美丽,我不愿失 去今生对你的记忆,我不求天长地久的美景,我只要生生世世的轮 回里有你。
谢谢!
36、自己的鞋子,自己知道紧在哪里。——西班牙
37、我们唯一不会改正的缺点是软弱。——拉罗什福科
xiexie! 38、我这个人走得很慢,但是我从不后退。——亚伯拉罕·林肯
ACM计算几何模板__HIT_jerrybond.

ACd
1
基础部分 1.几何公式.............................................................................................................................................. 5 1.1 三角形 ....................................................................................................................................... 5 1.2 四边形 ....................................................................................................................................... 5 1.3 正 n 边形 ...................................................................................................................................5 1.4 圆............................................................................................................................................... 5 1.5 棱柱.......................................
计算几何--ACM

三计算模型
规定RAM的原始运算如下: 1)算术运算 2)两个实数之间的比较 3)间接寻址及求根运算,三角函数运算,指 数函数运算,对数函数运算。 执行每种运算耗费一个时间单位。
四常见计算几何基本问题
• 矢量的概念
• • • • • • • • • • • • • • • • • • • • • • • • • • • •
基本问题(续)
• 在实际编程中,没有必要计算所有的交点,首先应判断线段和多边形的边是否内 交,倘若线段和多边形的某条边内交则线段一定在多边形外;如果线段和多边形 的每一条边都不内交,则线段和多边形的交点一定是线段的端点或者多边形的顶 点,只要判断点是否在线段上就可以了。
得出算法如下: if 线端PQ的端点不都在多边形内 then return false; 点集pointSet初始化为空; for 多边形的每条边s do if 线段的某个端点在s上 then 将该端点加入pointSet; else if s的某个端点在线段PQ上 then 将该端点加入pointSet; else if s和线段PQ相交 // 这时候已经可以肯定是内交了 then return false; 将pointSet中的点按照X-Y坐标排序; for pointSet中每两个相邻点 pointSet[i] , pointSet[ i+1] do if pointSet[i] , pointSet[ i+1] 的中点不在多边形中 then return false; return true; 这个过程中的排序因为交点数目肯定远小于多边形的顶点数目n,所以最多是 常数级的复杂度,几乎可以忽略不计。因此算法的时间复杂度也是O(n)。
基本问题(续)
基本问题(续)
ACM 竞赛培训

河南赛区赛题3
【 样例 】
河南赛区赛题4-枚举
在灾区,多数人已经受伤,缺水,少食物,精神处在崩溃的边缘。很多人的生存条件仅能维持几天。灾民 需要帐篷、衣物、食品和医疗器材、药品等物资。14日上午,中央军委委员、空军司令员许其亮组织召开 空军首长办公会,将空军下一步救灾重点确定为抢救伤员、空投、空运。空军各部队都派出多架运输机, 准备向灾区空运急需物品。 现在已知四种打包过的急需物品重量分别为C1, C2, C3,C4 ,数量分别为M1,M2,M3,M4包。一架运输 机的载重量为W, 现在各部队关心将一架运输机装满共有多少种运载方案,以便调度进行空运。 比如C={ 100, 200, 500, 1000},M={ 3, 2, 3, 1 }, W=1000, 一共有4种运载方案: 1000=100+100+100+200+500 1000=100+200+200+500 1000=500+500 1000=1000 【标准输入】 C1 C2 C3 C4 N 其中 N为空运的部队数 Mi1 Mi2 Mi3 Mi4 Wi 表示各运载部队需空运的4种物品数量Mi 和各自运输机的载重量Wi i=1,2,….. , N
河南赛区赛题2
【样 例】
河南赛区赛题3-排序查找算法
【试题三】 密码破译 某组织欲破获一个外星人的密码,密码由一定长度的字串组成。此组织拥有一些破译此密码 的长度不同的钥匙,若两个钥匙的长度之和恰好为此密码的长度,则此密码被成功破译。现 在就请你编程找出能破译此密码的两个钥匙。 【标准输入】 第一行: N N为钥匙的个数(1<=N<=1000) 第二行: L L为密码的长度 以下有N行: Ai 每一行是一把钥匙的长度 i=1,2,……,N 【标准输出】 若无法找到破译此密码的钥匙,则输出0 若找到两把破译的钥匙,则输出文件有两行,分别为两把钥匙的编号,按从小到大输出。若 有多种破译方案,则只输出包含起始编号最小的一组即可。 [【约束条件】 (1)1<= N,L,Ai <=1000(i=1, 2, ….., N ) (2)时间限制: 1000MS
ACM培训资料数据结构和算法

初 始 化 邻 接 矩 阵 arcs, 将 所 有 边 上 的 权 值 置 为 ∞
读 入 边 (v1 ,v2 )和 权 值 w
根 据 顶 点 v 1 ,v 2 查 找 顶 点 向 量 , 确 定 其 存 储 位 置 i,j
令 : G .a rc s [i][j].a d j= w ,若 有 相 关 信 息 , 输 入 弧 的 相 关 信 息 到 In fo ; 令 G .a rc s [j][i].a d j= w
2020/4/9
27
7.3.2 广度优先搜索 BFS
1)基本思想:
– 任选图中一个顶点 v ,访问此顶点,并作访问 标记。
– 从 v 出发,依次访问 v 的各个未曾被访问过的 邻接顶点 w1, w2, …, wt,并作访问标记。
– 然后再顺序访问 w1, w2, …, wt 的所有还未被访 问过的邻接顶点,并作访问标记。
N 已 读 入 arcnum 条 边 了 吗 ? Y
结束
13
7.2.2 邻接表 (Adjacency
1) 存储特点
List)
– 对于图G中的每个顶点vi,把所有邻接于vi的顶点vj链成一 个单链表,这个单链表称为顶点vi的邻接表;
– 将所有点的邻接表表头放到数组中,就构成了图的邻接表
2020/4/9
}Mgragh; /*Maragh是以邻接矩阵存储的图*/
2020/4/9
12
4)图的创建
创建以邻接矩阵存储的无向网
▪ 思路: 输 入 图 中 边 的 数 目 arcnum , 顶 点 数 目 vexnum
2020/4/9
依 次 读 入 vexnum 个 顶 点 信 息 , 存 入 顶 点 向 量
acm-计算几何模板

#include<bits/stdc++.h>using namespace std;const double eps =1e-8;const double INF =1e20;const double pi = acos ;int dcmp (double x) {if (fabs (x) < eps) return0;return (x <0-1:1);}$inline double sqr (double x) {return x*x;}f %.2f\n", x, y);}bool operator== (const Point &b) const {return (dcmp ==0&& dcmp ==0);}bool operator< (const Point &b) const {return (dcmp ==0 dcmp <0: x < ;}Point operator+ (const Point &b) const {return Point (x+, y+;`}Point operator- (const Point &b) const {return Point , ;}Point operator* (double a) {return Point (x*a, y*a);}Point operator/ (double a) {return Point (x/a, y/a);}double len2 () {f\n", r);;}bool operator== (const Circle &a) const {return p ==&& (dcmp ==0);}double area () {otate_left ());Line v = Line ((b+c)/2, ((b+c)/2) + (c-b).rotate_left ()); Point p = line_intersection (u, v);double r = dis (p, a);return Circle (p, r);}|Circle in_circle (Point a, Point b, Point c) { r -l*l);Point tmp =+ (l);p1 = tmp + ( ().change_len (h));p2 = tmp + ( ().change_len (h));if (rel ==2|| rel ==4) return1;return2;}int line_cirlce_intersection (Line v, Circle u, Point &p1, Point &p2) {hange_len (r1));= q + ( ().change_len (r1));== r1;*return2;}Line u1 = Line + ().change_len (r1), + ().change_len (r1));Line u2 = Line + ().change_len (r1), + ().change_len (r1));Circle cc = Circle (q, r1);Point p1, p2;if (!line_cirlce_intersection (u1, cc, p1, p2))line_cirlce_intersection (u2, cc, p1, p2);c1 = Circle (p1, r1);if (p1 == p2) {c2 = c1;^return1;}c2 = Circle (p2, r1);return2;}int get_circle (Line u, Line v, double r1, Circle &c1, Circle &c2, Circle &c3, Circle &c4) {hange_len (r1), + ().change_len (r1));Line u2 = Line + ().change_len (r1), + ().change_len (r1));Line v1 = Line + ().change_len (r1), + ().change_len (r1));Line v2 = Line + ().change_len (r1), + ().change_len (r1));==== r1;…= line_intersection (u1, v1);= line_intersection (u1, v2);= line_intersection (u2, v1);= line_intersection (u2, v2);return4;}int get_circle (Circle cx, Circle cy, double r1, Circle &c1, Circle &c2) {otate_left ());v = u;return1;}~double d = dis , q);double l =*d;double h = sqrt *- l*l);u = Line (q, + .change_len (l) + .rotate_left ().change_len (h)); v = Line (q, + .change_len (l) + .rotate_right ().change_len (h));return2;}double area_circle (Circle a, Circle v) {" << endl;return res;}/- ;int d2 = dcmp (b[(i+1)%n].y - ;if (k >0&& d1 <=0&& d2 >0)w++;if (k <0&& d2 <=0&& d1 >0)w--;}if (w !=0)return1;return0;—}int convex_cut (Line u, Point *p, int n, Point *po) {//直线切割多边形左侧//返回切割后多边形的数量int top =0;for (int i =0; i < n; i++) {int d1 = dcmp (cross p[i]);int d2 = dcmp (cross p[(i+1)%n]);if (d1 >=0) po[top++] = p[i];if (d1*d2 <0) po[top++] = line_intersection (u, Line (p[i], p[(i+1)%n]));}(return top;}double convex_circumference (Point *p, int n) {//多边形的周长(凹凸都可以)double ans =0;for (int i =0; i < n; i++) {ans += dis (p[i], p[(i+1)%n]);}return ans;}|double area_polygon_circle (Circle c, Point *p, int n) {//多边形和圆交面积double ans =0;for (int i =0; i < n; i++) {int j = (i+1)%n; //cout << i << " " << j << "//" << endl;if (dcmp (cross (p[j], p[i]) >=0)ans += circle_traingle_area (p[i], p[j], c);elseans -= circle_traingle_area (p[i], p[j], c);}return fabs (ans);}<Point centre_of_gravity (Point *p, int n) {//多边形的重心(凹凸都可以) double sum = , sumx =0, sumy =0;Point p1 = p[0], p2 = p[1], p3;for (int i =2; i <= n-1; i++) {p3 = p[i];double area = cross (p2-p1, p3-p2)/;sum += area;sumx +=++*area;sumy +=++*area;p2 = p3;~}return Point (sumx/*sum), sumy/*sum));}int convex_hull (Point *p, Point *ch, int n) {//求凸包//所有的点集凸包点集点集的点数sort (p, p+n);int m =0;for (int i =0; i < n; i++) {while (m >1&& cross (ch[m-1]-ch[m-2], p[i]-ch[m-1]) <=0) m--;ch[m++] = p[i];}int k = m;for (int i = n-2; i >=0; i--) {while (m > k && cross (ch[m-1]-ch[m-2], p[i]-ch[m-1]) <=0) m--;ch[m++] = p[i];}if (n >1)m--;return m;}。
ACM计算几何

快速排斥试验引申
• 思考: • 简单的改造一下就可以用来判断一个矩形 是否在另一个矩形内部 • NKOJ 1177 rectangles
凸包
• convex hull • 是指对于平面上给定的一些点,选取一个 最小的凸多边形使得这些点或者在其内部, 或者在其边上
求凸包的Graham扫描法
• 对于一个有三个或以上点的点集Q • 令p0为Q中Y-X坐标排序下最小的点 设<p1,p2,...pm>为对其余点按以p0为中心的极角 逆时针排序所得的点集(如果有多个点有相同的 极角,除了距p0最远的点外全部移除) 压p0进栈S,压p1进栈S,压p2进栈S for(i=3;i<=m;++i){ while(由S的栈顶元素的下一个元素、S的栈顶 元素以及pi构成的折线段不拐向左侧){ 对S弹栈 压pi进栈S } } return S
计算几何
需要注意的细节
• 常用头文件#include<math.h> • 计算几何中一般来说使用double型比较频 繁,请注意数据类型的选择,该用实数的 时候就用double,而float容易失去精度。 • 判断double型的x是否为0,应当用x<eps && x>-eps(或者fabs(x)<eps),其中eps 代表某个精度,常常取eps=0.000001,还 有其他类似情况也要注意double类型的精 度问题
需要注意的细节
• 圆周率取3.141592654或者更精确,或者用 acos(-1) • 角度制和弧度制的转换,C/C++中的三角函 数均为弧度制 • 尽量少用除法,开方,三角函数,容易失 去精度。用除法时注意除数不为0
向量及其运算
免费-ACM常用算法计算几何——吴翼-64页文档资料

◦ 一个避免精度问题的加速方法
Authored by Will, IIIS, THU 2020/1/21
8
预备知识:距离与交点的计算
点的距离计算
◦ 线段,直线 ◦ 圆,多边形
线段相关
◦ 线段距离? ◦ 线段的交点?
圆相关
◦ 直线与圆的距离与交点 ◦ 点与圆的切点 ◦ 两圆的公切点
计算方法
◦ 类似Monotone Chain O(NlogN)
更一般的性质与问题
◦ 简单正交多边形的正交凸包 ◦ 口袋的面积 ◦ 最小的周长
Authored by Will, IIIS, THU 2020/1/21
16
凸包上的序——凸性
凸包的定向 直线与凸包 矩形覆盖问题 点与凸包 凸包与凸包 凸包上的动态计算问题 凸包的划分问题
◦ 线段的相交测试 ◦ 面积的计算
右手方向与左手方向
Authored by Will, IIIS, THU 2020/1/21
7
预备知识:另一个例子
判断点在多边形内部
◦ 凸多边形 ◦ 简单多边形
射线法——效率高!
◦ 共线的处理?
随机斜率 纵切变换
转角法——优美!
◦ 精度问题?
浅谈一些几何问题
清华大学 交叉信息院 吴翼 Will
Authored by Will, IIIS, THU 2020/1/21
1
前言:计算几何与计算机科学
机械自动控制 地理信息贪测 计算机辅助设计 模式识别
◦ 人脸识别 ◦ 相关图像处理
游戏领域
◦ 碰撞检测 ◦ 光线追踪 ◦ 三维场景渲染
哈理工ACM-ICPC培训资料汇编(2-8)知识结构

ACM-ICPC培训资料汇编(2-8)目录(版本号1.0.0)哈尔滨理工大学ACM-ICPC集训队2012年12月目录ACM-ICPC培训资料汇编(2)基本数据结构与算法分册第1章基本数据结构.........................................................................................错误!未定义书签。
1.1 顺序表................................................................................................错误!未定义书签。
1.2 单链表................................................................................................错误!未定义书签。
1.3 双向链表............................................................................................错误!未定义书签。
1.4 循环链表............................................................................................错误!未定义书签。
1.5 栈........................................................................................................错误!未定义书签。
1.6 队列....................................................................................................错误!未定义书签。
ACM资料

作者:威士忌
价钱:0 hdoj币
所在位置:Hangzhou Dianzi University Online Judge Forum ? 资料下载 new!!
这一楼是ACM的资料等的简介以及连接,搜罗了好半天,各位看看啊!
这里主要分成免费的和收费的,为了自己方便,同时也是服务大家。
=============近日更新项目=============
1、添加新的题目代码:1237、2059、2060、2569、2568、2567。
2、居然发现HDU有人玩过仙剑4~~意外。
ACM课件(8)_搜索入门:/forum/read.php?tid=3669
ACM课件(9)_二分匹配入门:/forum/read.php?tid=3744
ACM课件(10)_母函数及其应用:/forum/read.php?tid=3853
简介:还记得lcy可见上的ACM Programming的比赛吗?可能已经过了,你还可以从Passed中找到,但是,这些题目的答案还是找不到的,除非你很有毅力,一道一道搜索。感谢menjitian,他把几次竞赛的题目整理出来了,大家可以看看!
下载地址:2008《ACM Programming》Exercise(1)_A+B 参考代码:
名称:HDOJ 题目 离线版 下载 最最最新版 2008-07-16 更新强烈推荐
作者:Linle
价钱:0 hdoj币
所在位置:Hangzhou Dianzi University Online Judge Forum ? 灌水专区
ACM培训精品PPT课件

自己过滤空格?麻烦!
输入输出
读一个非空白字符, 方法一:
char str[2]; scanf(“%1s”, str); // %1s扫描前导空白,并且只读一个字符 char c = str[0]; 方法二: 强制扫描空白 在%前面加上一个空格表示“强制扫描前导空白” scanf(“ %c”, &ch); 前面那个读人物信息的完整scanf语句:
LCS (Longest Common Subsequence) 最长 公共子串
输入输出
C:
scanf printf
C++:
cin cout
速度快 格式容易控制
使用简单, 自动识别类型 格式控制较麻烦
数据规模较大时, 推荐(必须)使用scanf 以 避免超时(TLE)
输入输出
cout: 带缓冲输出 printf: 不带缓冲输出
Ctrl+Z 2.最好不要把C和C++的输入输出语句混着用,会造成一些莫名其妙的问题 3.我个人倾向于使用纯C的输入输出,因为方便且速度快。
关于重定向操作
当程序要输入的内容很多时,从文件读入的操作变得非常重 要,特别是需要调试时,这样可以避免你反复的从键盘敲入重
复的内容。
使用标准输入语句,可以使用重定向命令行
scanf(“%s %c %s”, name, &gender, ability);
输入输出
同理,我们也可以用其它字符来扫描其它类型 的无关输入
比如,输入年月日的信息
2007-08-03 scanf(“%d-%d-%d”, &y, &m, &d); 其它类似
浮点数的输入问题
为什么说while(in!=0.00)不合理呢? 如果不合理应该怎么判断!!
ACM资料

最优比率生成树
0/1分数规划
度限制生成树
连通性问题
强大的DFS算法
无向图连通性
割点
割边
二连通分支
有向图连通性
强连通分支
2-SAT
最小点基
有向无环图
拓扑排序
有向无环图与动态规划的关系
二分图匹配问题
一般图问题与二分图问题的转换思路
组合数学
解决组合数学问题时常用的思想
逼近
递推 / 动态规划
概率问题
Polya定理
计算几何 / 解析几何
计算几何的核心:叉积 / 面积
解析几何的主力:复数
基本形
点
直线,线段
多边形
凸多边形 / 凸包
凸包算法的引进,卷包裹法
数论计算
求N的约数个数
求phi(N)
求约数和
快速数论变换
……
素数问题
概率判素算法
概率因子分解
数据结构
组织结构
二叉堆
左偏树
二项树
胜者树
跳跃表
样式图标
斜堆
reap
统计结构
树状数组
虚二叉树
线段树
8. 调用系统的qsort, 技巧很多,慢慢掌握.
9. 任意进制间的转换
第二阶段:
练习复杂一点,但也较常用的算法。
如:
1. 二分图匹配(匈牙利),最小路径覆盖
2. 网络流,最小费用流。
3. 线段树.
4. 并查集。
5. 熟悉动态规划的各个典型:LCS、最长递增子串、三角剖分、记忆化dp
ACM-ICPC培训资料汇编:博弈

ACM-ICPC培训资料汇编:博弈《ACMICPC 培训资料汇编:博弈》在计算机科学和数学的交叉领域中,博弈论是一个引人入胜且具有重要应用价值的研究方向。
对于参加 ACMICPC(国际大学生程序设计竞赛)的选手来说,掌握博弈相关的知识和技巧是提升竞赛能力的关键之一。
首先,让我们来理解一下什么是博弈。
简单来说,博弈就是指在一定的规则下,多个参与者进行策略选择,以达到各自的目标。
在这个过程中,参与者的决策会相互影响,最终的结果取决于所有人的选择。
博弈论中有许多经典的模型和问题,比如“囚徒困境”。
在这个模型中,两个犯罪嫌疑人被分别审讯,如果两人都保持沉默(合作),那么他们都将受到较轻的惩罚;如果一人坦白而另一人沉默(背叛),坦白者将获得从轻处罚,沉默者将受到重罚;如果两人都坦白,那么他们都将受到较重的惩罚。
在这种情况下,从个体理性的角度出发,坦白似乎是最优选择,但从整体来看,两人都保持沉默才是最优结果。
这个例子展示了个体利益与集体利益之间的冲突,以及在博弈中如何做出决策。
再比如“Nim 游戏”,这是一个非常经典的博弈问题。
假设有若干堆石子,两个玩家轮流从其中一堆中取走任意数量的石子,最后取完石子的玩家获胜。
通过对这个游戏的分析,我们可以找到获胜的策略。
在ACMICPC 竞赛中,经常会遇到需要运用博弈思想来解决的问题。
那么,如何培养解决这类问题的能力呢?第一步,要熟悉常见的博弈模型和策略。
这就像是学习数学公式一样,只有记住了常见的模型和对应的策略,才能在遇到问题时迅速找到解题的思路。
例如,“巴什博弈”“威佐夫博弈”等,都有其特定的规律和解题方法。
第二步,要善于分析问题,将实际问题转化为已知的博弈模型。
这需要我们对问题进行深入的思考,找出其中的关键要素和规则,然后与所学的模型进行对比和匹配。
第三步,多做练习。
通过大量的练习题,我们可以加深对博弈知识的理解,提高运用策略的熟练程度。
在练习的过程中,要注意总结经验,分析自己解题过程中的错误和不足之处,不断改进。
ilndeo清_华大学ACM集训队培训资料(内部使用)

该程序的运行结果为 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 3 1 2 那么,该函数就完成了对一个数组进行全排列的操作 下面,分析该程序,我用圆圈代表每次函数的调用 每次函数的调用都用序号表示 1 2 8 5 3 4 6 7 9 10 k=0 k=1 k=2 1.
1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
、| !_ 一个人总要走陌生的路,看陌生的风景,听陌生的歌,然 后在某个不经意的瞬间,你会发现,原本费尽心机想要忘记的 事情真的就这么忘记了..
清华大学ACM集训队培训资料(内部使用) 一、C++基础 基本知识 所有的C++程序都是有函数组成的, 函数又叫做子程序,且每个 C++程序必须包含一个main函数,编译器(能够把源代码转换成目标代 码的程序)把翻译后的目标代码和一些启动代码组合起来,生成可执行 文件,main函数就是可执行文件的入口,所以,每个C++程序有且只有 一个main函数。 下面我们看一个最简单C++程序。(程序1.1) 程序1.1 int main(){return 0;} 在这个程序中,如果缺少任何一个字符,编译器就无法将其翻译成 机器代码。 此外,C++是对大小写敏感的,这就意味着,如果我将mian()函数拼 为Main(),哪么,编译器在编译这段程序的时候就会出错。 编辑源文件 能够提共管理程序开发的所有步骤,包括编辑的程序成为集成开发 环境(integrated development evironments, IDE)。在windows系统下, 使用较为广泛的有Microsoft Visual C++、Dev-Cpp等,在UNIX系统下, 有Vim、emacs、eclipes等。这些程序都能提供一个较好的开发平台,使 我们能够方便的开发一个程序,接下我们所要了解的都是标准C++,所 有源代码都在Dev-cpp下编写,能够编译通过。 如果我们修改程序1.1中的main()函数的名称,将其改为Main(),那 么,IDE就会给出错误信息,比如“ [Linker error] undefined reference to `WinMain@16'”,因为编译器没有找到main函数。 接下来,我们来看一个经典的C++例子(程序1.2)
acm计算几何_讲义

PKU 3304 segments
Output
For each test case, your program must output "Yes!", if a line with desired property exists and must output "No!" otherwise. You must assume that two floating point numbers a and b are equal if |a - b| < 10-8.
PKU 3304 segments
Description
ห้องสมุดไป่ตู้
Given n segments in the two dimensional space, write a program, which determines if there exists a line such that after projecting these segments on it, all projected segments have at least one point in common.
You are to find the length of the shortest path through a chamber containing obstructing walls. The chamber will always have sides at x = 0, x = 10, y = 0, and y = 10. The initial and final points of the path are always (0, 5) and (10, 5). There will also be from 0 to 18 vertical walls inside the chamber, each with two doorways. The figure below illustrates such a chamber and also shows the path of minimal length.
ACM必做50题的解题-计算几何

ACM必做50题的解题-计算几何.txt生活,是用来经营的,而不是用来计较的。
感情,是用来维系的,而不是用来考验的。
爱人,是用来疼爱的,而不是用来伤害的。
金钱,是用来享受的,而不是用来衡量的。
谎言,是用来击破的,而不是用来装饰的。
信任,是用来沉淀的,而不是用来挑战的。
POJ 1113 WALL计算几何,求凸包这题的结果等于这个多边形构成的凸包的周长加上以所给半径为半径的圆的周长步骤如下:1)算法首先寻找最最靠下方的点,如果遇到y坐标相同,则寻找x坐标最小的点firstP2)然后根据所有点相对于firstP的偏角的大小进行排序,遇到偏角相等的,只取距离firstP最远的点(排序利用自己手写的快排)3)然后利用Graham算法求凸包4)最后直接求职#include <iostream>#include <cmath>#define PI 3.1415926#define MAX_N 1000using namespace std;//存储原始输入的坐标值,rad是输入的半径double cord[MAX_N + 2][2], rad;int seq[MAX_N + 2];int stack[MAX_N + 2];int n, top;int firstP;int realN;void swap(int pos1, int pos2){int temp = seq[pos1];seq[pos1] = seq[pos2];seq[pos2] = temp;}int dir(int nodes, int node1, int node2){double x1 = cord[node1][0], y1 = cord[node1][1];double x2 = cord[node2][0], y2 = cord[node2][1];double sx = cord[nodes][0], sy = cord[nodes][1];return (x2 - sx) * (y1 - sy) - (x1 - sx) * (y2 - sy);}double getDist(int node1, int node2){double x1 = cord[node1][0], y1 = cord[node1][1];double x2 = cord[node2][0], y2 = cord[node2][1];double res = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));return res;}int compare(int node1, int node2){double x1 = cord[node1][0], y1 = cord[node1][1];double x2 = cord[node2][0], y2 = cord[node2][1];double sx = cord[firstP][0], sy = cord[firstP][1];double type = dir(firstP, node1, node2);if(type == 0){double dist1 = (x1 - sx) * (x1 - sx) + (y1 - sy) * (y1 - sy);double dist2 = (x2 - sx) * (x2 - sx) + (y2 - sy) * (y2 - sy);if(dist1 > dist2)return -2;else if(dist1 == dist2)return 0;elsereturn 2;}else if(type > 0)return 1;elsereturn -1;}void fastSort(int start, int end){if(start < end){int curPos = start;int posS = start, posE = end + 1;while(true){while(compare(seq[++posS], seq[curPos]) < 0 && posS < end); while(compare(seq[--posE], seq[curPos]) > 0 && posE > start); if(posS < posE)swap(posS, posE);elsebreak;}swap(curPos, posE);fastSort(start, posE - 1);fastSort(posE + 1, end);}}void sortSeq(){int i, s = 0;for(i = 1; i <= n; i++){//最低最左点不参加排序if(i == firstP)continue;seq[++s] = i;}realN = n - 1;fastSort(1, realN);//清理夹角相同但是距离不同的点,只取举例firstP最远的点i = 1;while(i < realN){s = i + 1;//equal angle but smaller distancewhile(s <= realN && compare(seq[i], seq[s]) == -2) {seq[s] = -1; //置为无效s++;}i = s;}}//寻找凸包void findQ(){int nodes, node1, node2, type;top = 0;stack[top++] = firstP;int s = 1;int c = 0;while(c < 2){if(seq[s] != -1){c++;stack[top++] = seq[s];}s++;}for(; s <= realN; s++){if(seq[s] == -1)continue;while(true){nodes = stack[top - 2];node1 = stack[top - 1];node2 = seq[s];type = dir(nodes, node1, node2);if(type >= 0)top--;elsebreak;}stack[top++] = seq[s];}}double getRes(){double totalDist = 0;int lastNode = firstP;int curNode;while(top > 0){curNode = stack[--top];totalDist += getDist(lastNode, curNode);lastNode = curNode;}//totalDist += getDist(lastNode, firstP);totalDist += 2 * PI * rad;return totalDist;}int main(){int i;cin>>n>>rad;int minX = INT_MAX, minY = INT_MAX;for(i = 1; i <= n; i++){cin>>cord[i][0]>>cord[i][1];if((cord[i][1] < minY) || (cord[i][1] == minY && cord[i][0] < minX)){firstP = i;minX = cord[i][0];minY = cord[i][1];}}sortSeq();findQ();double res = getRes();printf("%.0f\n", res);return 0;}POJ1292 Will Indiana Jones Get There?题目大意:英雄Jones现在在位置1,有人在位置2呼救,所以他要过去救他,但是有个条件,他必须在墙上走,其实就是说他只能在图示的线段上走,但是线段间有空隙,所以要用一个长板搭在线段间才能从一个线段到另外一个线段,问怎么找到一个路径使得要使用的长板最小。
ACM算法 计算几何基础ppt课件

57 2020/4/15
58 2020/4/15
59 2020/4/15
60 2020/4/15
61 2020/4/15
62 2020/4/15
63 2020/4/15
64 2020/4/15
特别提醒:
以上介绍的线段的三个属性, 是计算几何的基础,在很多方 面都有应用,比如求凸包等等, 请务必掌握!
15 2020/4/15
第二单元
多边形面积 和重心
16 2020/4/15
基本问题(1):
给定一个简单多边形,求其 面积。
输入:多边形(顶点按逆时 针顺序排列)
输出:面积S
17 2020/4/15
A=sigma(Ai) (i=1…N-2)
P1
A1 P2
P6 A4
P5 A3
A2 P4
P3
25 2020/4/15
凹多边形的面积?
P3
P2 P4
P1
26 2020/4/15
依然成立!!!
多边形面积公式:A=sigma(Ai) (i=1…N-2)
结论: “有向面积”A比“面积”S其实更本
质!
27 2020/4/15
思考如下图形:
18 2020/4/15
Any good idea?
19 2020/4/15
先讨论最简单的多边形——三角形
20 2020/4/15
三角形的面积:
在解析几何里, △ABC的面积可以通过 如下方法求得:
点坐标 => 边长 => 海伦公式 => 面积
21 2020/4/15
思考:此方法的缺点:
C=sigma((↑Pi +↑Pi+1)(↑Pi ×↑Pi+1) ) /(6A)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算几何分册
(版本号 1.0.0)
哈尔滨理工大学 ACM-ICPC 集训队 2012 年 12 月
哈尔滨理工大学 ACM-ICPC 培训资料汇编
序
2012 年 5 月,哈尔滨理工大学承办了 ACM-ICPC 黑龙江省第七届大学生程序设计竞 赛。做为本次竞赛的主要组织者,我还是很在意本校学生是否能在此次竞赛中取得较好成 绩,毕竟这也是学校的脸面。因此,当 2011 年 10 月确定学校承办本届竞赛后,我就给齐 达拉图同学很大压力,希望他能认真训练参赛学生,严格要求受训队员。当然,齐达拉图 同学半年多的工作还是很有成效,不仅带着黄李龙、姜喜鹏、程宪庆、卢俊达等队员开发 了我校的 OJ 主站和竞赛现场版 OJ,还集体带出了几个比较像样的新队员,使得今年省赛 我校取得了很好的成绩(当然,也承蒙哈工大和哈工程关照,没有派出全部大牛来参 赛)。
第 8 章 计算几何........................................................................................................................4 8.1 基本几何运算...................................................................................................................4 8.1.1 基本原理....................................................................................................................4 8.1.2 解题思路..................................................................................................................25 8.1.3 模板代码..................................................................................................................25 8.1.4 扩展变型..................................................................................................................26 8.2 凸包.................................................................................................................................28 8.2.1 基本原理..................................................................................................................28 8.2.2 求凸包的几种算法..................................................................................................28 8.2.3 解题思路..................................................................................................................34 8.2.4 模板代码..................................................................................................................34 8.2.5 经典题目..................................................................................................................38 8.3 半平面交.........................................................................................................................40 8.3.1 基本原理..................................................................................................................40 8.3.2 求半平面交的方法..................................................................................................40 8.3.3 解题思路..................................................................................................................44 8.3.4 模板代码..................................................................................................................45 8.3.5 经典题目..................................................................................................................48 8.3.6 扩展变形..................................................................................................................50 8.4 最近点对.........................................................................................................................50 8.4.1 基本原理..................................................................................................................51 8.4.2 解题思路..................................................................................................................52 8.4.3 模板代码..................................................................................................................52 8.4.4 经典题目..................................................................................................................54 8.5 最远点对.........................................................................................................................56 8.5.1 基本原理..................................................................................................................56 8.5.2 解题思路..................................................................................................................56 8.5.3 模板代码..................................................................................................................56 8.5.4 经典题目..................................................................................................................57 8.6 模拟退火(Simulated Annealing).....................................................................................59 8.6.1 基本原理..................................................................................................................59 8.6.2 解题思路..................................................................................................................61 8.6.3 模板代码..................................................................................................................61 8.6.4 经典题目..................................................................................................................61 8.6.5 扩展变型..................................................................................................................63