ImageVerifierCode 换一换
格式:DOCX , 页数:152 ,大小:63.21KB ,
资源ID:7526723      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7526723.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(浙江大学ACM模板汇编.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

浙江大学ACM模板汇编.docx

1、浙江大学ACM模板汇编Zhejiang UniversityICPC TeamRoutine Libraryby WishingBone (Dec. 2002)Last Update (Nov. 2004) by Riveria1、几何1.1注意1. 注意舍入方式(0.5的舍入方向);防止输出-0.2. 几何题注意多测试不对称数据.3. 整数几何注意xmult和dmult是否会出界; 符点几何注意eps的使用.4. 避免使用斜率;注意除数是否会为0.5. 公式一定要化简后再代入.6. 判断同一个2*PI域内两角度差应该是 abs(a1-a2)pi+pi-beta; 相等应该是 abs(a1-a

2、2)pi+pi-eps;7. 需要的话尽量使用atan2,注意:atan2(0,0)=0, atan2(1,0)=pi/2,atan2(-1,0)=-pi/2,atan2(0,1)=0,atan2(0,-1)=pi.8. cross product = |u|*|v|*sin(a) dot product = |u|*|v|*cos(a)9. (P1-P0)x(P2-P0)结果的意义: 正: 在顺时针(0,pi)内 负: 在逆时针(0,pi)内 0 : ,共线,夹角为0或pi10. 误差限缺省使用1e-8!1.2几何公式三角形:1. 半周长 P=(a+b+c)/22. 面积 S=aHa/2=a

3、bsin(C)/2=sqrt(P(P-a)(P-b)(P-c)3. 中线 Ma=sqrt(2(b2+c2)-a2)/2=sqrt(b2+c2+2bccos(A)/24. 角平分线 Ta=sqrt(bc(b+c)2-a2)/(b+c)=2bccos(A/2)/(b+c)5. 高线 Ha=bsin(C)=csin(B)=sqrt(b2-(a2+b2-c2)/(2a)2)6. 内切圆半径 r=S/P=asin(B/2)sin(C/2)/sin(B+C)/2) =4Rsin(A/2)sin(B/2)sin(C/2)=sqrt(P-a)(P-b)(P-c)/P) =Ptan(A/2)tan(B/2)ta

4、n(C/2)7. 外接圆半径 R=abc/(4S)=a/(2sin(A)=b/(2sin(B)=c/(2sin(C)四边形:D1,D2为对角线,M对角线中点连线,A为对角线夹角1. a2+b2+c2+d2=D12+D22+4M22. S=D1D2sin(A)/2(以下对圆的内接四边形)3. ac+bd=D1D24. S=sqrt(P-a)(P-b)(P-c)(P-d),P为半周长正n边形:R为外接圆半径,r为内切圆半径1. 中心角 A=2PI/n2. 内角 C=(n-2)PI/n3. 边长 a=2sqrt(R2-r2)=2Rsin(A/2)=2rtan(A/2)4. 面积 S=nar/2=nr

5、2tan(A/2)=nR2sin(A)/2=na2/(4tan(A/2)圆:1. 弧长 l=rA2. 弦长 a=2sqrt(2hr-h2)=2rsin(A/2)3. 弓形高 h=r-sqrt(r2-a2/4)=r(1-cos(A/2)=atan(A/4)/24. 扇形面积 S1=rl/2=r2A/25. 弓形面积 S2=(rl-a(r-h)/2=r2(A-sin(A)/2棱柱:1. 体积 V=Ah,A为底面积,h为高2. 侧面积 S=lp,l为棱长,p为直截面周长3. 全面积 T=S+2A棱锥:1. 体积 V=Ah/3,A为底面积,h为高(以下对正棱锥)2. 侧面积 S=lp/2,l为斜高,p

6、为底面周长3. 全面积 T=S+A棱台:1. 体积 V=(A1+A2+sqrt(A1A2)h/3,A1.A2为上下底面积,h为高(以下为正棱台)2. 侧面积 S=(p1+p2)l/2,p1.p2为上下底面周长,l为斜高3. 全面积 T=S+A1+A2圆柱:1. 侧面积 S=2PIrh2. 全面积 T=2PIr(h+r)3. 体积 V=PIr2h圆锥:1. 母线 l=sqrt(h2+r2)2. 侧面积 S=PIrl3. 全面积 T=PIr(l+r)4. 体积 V=PIr2h/3圆台:1. 母线 l=sqrt(h2+(r1-r2)2)2. 侧面积 S=PI(r1+r2)l3. 全面积 T=PIr1

7、(l+r1)+PIr2(l+r2)4. 体积 V=PI(r12+r22+r1r2)h/3球:1. 全面积 T=4PIr22. 体积 V=4PIr3/3球台:1. 侧面积 S=2PIrh2. 全面积 T=PI(2rh+r12+r22)3. 体积 V=PIh(3(r12+r22)+h2)/6球扇形:1. 全面积 T=PIr(2h+r0),h为球冠高,r0为球冠底面半径2. 体积 V=2PIr2h/31.3多边形#include #include #define MAXN 1000#define offset 10000#define eps 1e-8#define zero(x) (x)0?(x)

8、:-(x)eps?1:(x)-eps?2:0)struct pointdouble x,y;struct linepoint a,b;double xmult(point p1,point p2,point p0) return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);/判定凸多边形,顶点按顺时针或逆时针给出,允许相邻边共线int is_convex(int n,point* p) int i,s3=1,1,1; for (i=0;in&s1|s2;i+) s_sign(xmult(p(i+1)%n,p(i+2)%n,pi)=0; ret

9、urn s1|s2;/判定凸多边形,顶点按顺时针或逆时针给出,不允许相邻边共线int is_convex_v2(int n,point* p) int i,s3=1,1,1; for (i=0;in&s0&s1|s2;i+) s_sign(xmult(p(i+1)%n,p(i+2)%n,pi)=0; return s0&s1|s2;/判点在凸多边形内或多边形边上,顶点按顺时针或逆时针给出int inside_convex(point q,int n,point* p) int i,s3=1,1,1; for (i=0;in&s1|s2;i+) s_sign(xmult(p(i+1)%n,q,p

10、i)=0; return s1|s2;/判点在凸多边形内,顶点按顺时针或逆时针给出,在多边形边上返回0int inside_convex_v2(point q,int n,point* p) int i,s3=1,1,1; for (i=0;in&s0&s1|s2;i+) s_sign(xmult(p(i+1)%n,q,pi)=0; return s0&s1|s2;/判点在任意多边形内,顶点按顺时针或逆时针给出/on_edge表示点在多边形边上时的返回值,offset为多边形坐标上限int inside_polygon(point q,int n,point* p,int on_edge=1)

11、 point q2; int i=0,count; while (in) for (count=i=0,q2.x=rand()+offset,q2.y=rand()+offset;in;i+) if (zero(xmult(q,pi,p(i+1)%n)&(pi.x-q.x)*(p(i+1)%n.x-q.x)eps&(pi.y-q.y)*(p(i+1)%n.y-q.y)eps) return on_edge; else if (zero(xmult(q,q2,pi) break; else if (xmult(q,pi,q2)*xmult(q,p(i+1)%n,q2)-eps&xmult(pi,

12、q,p(i+1)%n)*xmult(pi,q2,p(i+1)%n)-eps) count+; return count&1;inline int opposite_side(point p1,point p2,point l1,point l2) return xmult(l1,p1,l2)*xmult(l1,p2,l2)-eps;inline int dot_online_in(point p,point l1,point l2) return zero(xmult(p,l1,l2)&(l1.x-p.x)*(l2.x-p.x)eps&(l1.y-p.y)*(l2.y-p.y)eps;/判线段

13、在任意多边形内,顶点按顺时针或逆时针给出,与边界相交返回1int inside_polygon(point l1,point l2,int n,point* p) point tMAXN,tt; int i,j,k=0; if (!inside_polygon(l1,n,p)|!inside_polygon(l2,n,p) return 0; for (i=0;in;i+) if (opposite_side(l1,l2,pi,p(i+1)%n)&opposite_side(pi,p(i+1)%n,l1,l2) return 0; else if (dot_online_in(l1,pi,p(

14、i+1)%n) tk+=l1; else if (dot_online_in(l2,pi,p(i+1)%n) tk+=l2; else if (dot_online_in(pi,l1,l2) tk+=pi; for (i=0;ik;i+) for (j=i+1;jk;j+) tt.x=(ti.x+tj.x)/2; tt.y=(ti.y+tj.y)/2; if (!inside_polygon(tt,n,p) return 0; return 1;point intersection(line u,line v) point ret=u.a; double t=(u.a.x-v.a.x)*(v.

15、a.y-v.b.y)-(u.a.y-v.a.y)*(v.a.x-v.b.x) /(u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x); ret.x+=(u.b.x-u.a.x)*t; ret.y+=(u.b.y-u.a.y)*t; return ret;point barycenter(point a,point b,point c) line u,v; u.a.x=(a.x+b.x)/2; u.a.y=(a.y+b.y)/2; u.b=c; v.a.x=(a.x+c.x)/2; v.a.y=(a.y+c.y)/2; v.b=b; re

16、turn intersection(u,v);/多边形重心point barycenter(int n,point* p) point ret,t; double t1=0,t2; int i; ret.x=ret.y=0; for (i=1;ieps) t=barycenter(p0,pi,pi+1); ret.x+=t.x*t2; ret.y+=t.y*t2; t1+=t2; if (fabs(t1)eps) ret.x/=t1,ret.y/=t1; return ret;1.4多边形切割/多边形切割/可用于半平面交#define MAXN 100#define eps 1e-8#defi

17、ne zero(x) (x)0?(x):-(x)eps;point intersection(point u1,point u2,point v1,point v2) point ret=u1; double t=(u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x) /(u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x); ret.x+=(u2.x-u1.x)*t; ret.y+=(u2.y-u1.y)*t; return ret;/将多边形沿l1,l2确定的直线切割在side侧切割,保证l1,l2,side不

18、共线void polygon_cut(int& n,point* p,point l1,point l2,point side) point pp100; int m=0,i; for (i=0;in;i+) if (same_side(pi,side,l1,l2) ppm+=pi; if (!same_side(pi,p(i+1)%n,l1,l2)&!(zero(xmult(pi,l1,l2)&zero(xmult(p(i+1)%n,l1,l2) ppm+=intersection(pi,p(i+1)%n,l1,l2); for (n=i=0;im;i+) if (!i|!zero(ppi.

19、x-ppi-1.x)|!zero(ppi.y-ppi-1.y) pn+=ppi; if (zero(pn-1.x-p0.x)&zero(pn-1.y-p0.y) n-; if (n3) n=0;1.5浮点函数/浮点几何函数库#include #define eps 1e-8#define zero(x) (x)0?(x):-(x)eps)struct pointdouble x,y;struct linepoint a,b;/计算cross product (P1-P0)x(P2-P0)double xmult(point p1,point p2,point p0) return (p1.x-

20、p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);double xmult(double x1,double y1,double x2,double y2,double x0,double y0) return (x1-x0)*(y2-y0)-(x2-x0)*(y1-y0);/计算dot product (P1-P0).(P2-P0)double dmult(point p1,point p2,point p0) return (p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y);double dmult(double

21、 x1,double y1,double x2,double y2,double x0,double y0) return (x1-x0)*(x2-x0)+(y1-y0)*(y2-y0);/两点距离double distance(point p1,point p2) return sqrt(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);double distance(double x1,double y1,double x2,double y2) return sqrt(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);/判三点共线i

22、nt dots_inline(point p1,point p2,point p3) return zero(xmult(p1,p2,p3);int dots_inline(double x1,double y1,double x2,double y2,double x3,double y3) return zero(xmult(x1,y1,x2,y2,x3,y3);/判点是否在线段上,包括端点int dot_online_in(point p,line l) return zero(xmult(p,l.a,l.b)&(l.a.x-p.x)*(l.b.x-p.x)eps&(l.a.y-p.y)

23、*(l.b.y-p.y)eps;int dot_online_in(point p,point l1,point l2) return zero(xmult(p,l1,l2)&(l1.x-p.x)*(l2.x-p.x)eps&(l1.y-p.y)*(l2.y-p.y)eps;int dot_online_in(double x,double y,double x1,double y1,double x2,double y2) return zero(xmult(x,y,x1,y1,x2,y2)&(x1-x)*(x2-x)eps&(y1-y)*(y2-y)eps;int same_side(po

24、int p1,point p2,point l1,point l2) return xmult(l1,p1,l2)*xmult(l1,p2,l2)eps;/判两点在线段异侧,点在线段上返回0int opposite_side(point p1,point p2,line l) return xmult(l.a,p1,l.b)*xmult(l.a,p2,l.b)-eps;int opposite_side(point p1,point p2,point l1,point l2) return xmult(l1,p1,l2)*xmult(l1,p2,l2)-eps;/判两直线平行int paral

25、lel(line u,line v) return zero(u.a.x-u.b.x)*(v.a.y-v.b.y)-(v.a.x-v.b.x)*(u.a.y-u.b.y);int parallel(point u1,point u2,point v1,point v2) return zero(u1.x-u2.x)*(v1.y-v2.y)-(v1.x-v2.x)*(u1.y-u2.y);/判两直线垂直int perpendicular(line u,line v) return zero(u.a.x-u.b.x)*(v.a.x-v.b.x)+(u.a.y-u.b.y)*(v.a.y-v.b.y);int perpendicular(point u1,point u2,point v1,point v2) return zero(u1.x-u2.x)*(v1.x-v2.x)+(u1.y-u2.y)*(v1.y-v2.y);/判两线段相交,包括端点和部分重合int intersect_in(line u,line v) if (!dots_inline(u.a,u.b,v.a)|!dots_inline(u.a,u.b,v.b) return !same_side(u.a,u.b,v)&!

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1