各种公式及模板

萌到你眼炸
901次浏览
2020年12月06日 07:08
最佳经验
本文由作者推荐

赞美老师的名言名句-24节气养生法

2020年12月6日发(作者:贺友直)


各种公式及模板
1、 几何... 25

1.1 注意... 25

1.2 几何公式... 25

1.3 多边形... 27

1.4 多边形切割... 30

1.5 浮点函数... 31

1.6 面积... 36

1.7 球面... 37

1.8 三角形... 38

1.9 三维几何... 40

1.10 凸包... 47

1.11 网格... 49

1.12 圆... 49

1.13 整数函数... 51

2、 组合... 54

1 28


2.1 组合公式... 54

2.2 排列组合生成... 54

2.3 生成gray码... 56

2.4 置换(polya) 56

2.5 字典序全排列... 57

2.6 字典序组合... 57

3、 结构... 58

3.1 并查集... 58

3.2 堆... 59

3.3 线段树... 60

3.4 子段和... 65

3.5 子阵和... 65

4、 数论... 66

4.1 阶乘最后非0位... 66

4.2 模线性方程组... 67

4.3 素数... 68
2 28



4.4 欧拉函数... 69

5、 数值计算... 70

5.1 定积分计算(Romberg) 70

5.2 多项式求根(牛顿法) 72

5.3 周期性方程(追赶法) 73

6、 图论—NP搜索... 74

6.1 最大团... 74

6.2 最大团(n<64)(faster) 75

7、 图论—连通性... 77

7.1 无向图关键点(dfs邻接阵) 77

7.2 无向图关键边(dfs邻接阵) 78

7.3 无向图的块(bfs邻接阵) 79

7.4 无向图连通分支(dfsbfs邻接阵) 80

7.5 有向图强连通分支(dfsbfs邻接阵) 81

7.6 有向图最小点基(邻接阵) 82

3 28


8、 图论—匹配... 83

8.1 二分图最大匹配(hungary邻接表) 83

8.2 二分图最大匹配(hungary邻接阵) 84

8.3 二分图最大匹配(hungary正向表) 84

8.4二分图最佳匹配(kuhn_munkras邻接阵) 85

8.5 一般图匹配(邻接表) 86

8.6 一般图匹配(邻接阵) 87

8.7 一般图匹配(正向表) 87

9、 图论—网络流... 88

9.1 最大流(邻接阵) 88

9.2 上下界最大流(邻接阵) 89

9.3 上下界最小流(邻接阵) 90

9.4 最大流无流量(邻接阵) 91

9.5 最小费用最大流(邻接阵) 91

10、 图论—应用... 92

10.1 欧拉回路(邻接阵) 92
4 28



10.2 树的前序表转化... 93

10.3 树的优化算法... 94

10.4 拓扑排序(邻接阵) 95

10.5 最佳边割集... 96

10.6 最佳点割集... 97

10.7 最小边割集... 98

10.8 最小点割集... 99

10.9 最小路径覆盖... 101

11、 图论—支撑树... 101

11.1 最小生成树(kruskal邻接表) 101

11.2 最小生成树(kruskal正向表) 103

11.3 最小生成树(prim+binary_heap邻接表) 104

11.4 最小生成树(prim+binary_heap正向表) 105

11.5 最小生成树(prim+mapped_heap邻接表) 106

11.6 最小生成树(prim+mapped_heap正向表) 108

5 28


11.7 最小生成树(prim邻接阵) 109

11.8 最小树形图(邻接阵) 109

12、 图论—最短路径... 111

12.1 最短路径(单源bellman_ford邻接阵) 111

12.2 最短路径(单源dijkstra+bfs邻接表) 111

12.3 最短路径(单源dijkstra+bfs正向表) 112

12.4 最短路径(单源dijkstra+binary_heap邻接表) 113

12.5 最短路径(单源dijkstra+binary_heap正向表) 114

12.6 最短路径(单源dijkstra+mapped_heap邻接表) 115

12.7 最短路径(单源dijkstra+mapped_heap正向表) 116

12.8 最短路径(单源dijkstra邻接阵) 117

12.9 最短路径(多源floyd_warshall邻接阵) 118

13、 应用... 118

13.1 Joseph问题... 118

13.2 N皇后构造解... 119

13.3 布尔母函数... 120
6 28



13.4 第k元素... 120

13.5 幻方构造... 121

13.6 模式匹配(kmp) 122

13.7 逆序对数... 123

13.8 字符串最小表示... 123

13.9 最长公共单调子序列... 124

13.10 最长子序列... 125

13.11 最大子串匹配... 126

13.12 最大子段和... 127

13.13 最大子阵和... 127

14、 其它... 128

14.1 大数(只能处理正数) 128

14.2 分数... 134

14.3 矩阵... 136

14.4 线性方程组... 138

7 28


14.5 线性相关... 140

14.6 日期... 140



1、 几何
1.1 注意
1. 注意舍入方式(0.5的舍入方向);防止输出-0.



2. 几何题注意多测试不对称数据.



3. 整数几何注意xmult和dmult是否会出界;

符点几何注意eps的使用.



4. 避免使用斜率;注意除数是否会为0.



5. 公式一定要化简后再代入.



6. 判断同一个2*PI域内两角度差应该是
8 28



abs(a1-a2)pi+pi-beta;

相等应该是

abs(a1-a2)pi+pi-eps;



7. 需要的话尽量使用atan2,注意:atan2(0,0)=0,


atan2(1,0)=pi2,atan2(-1,0)=-pi2,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或pi

9 28




10. 误差限缺省使用1e-8!

1.2 几何公式
三角形:

1. 半周长 P=(a+b+c)2

2. 面积 S=aHa2=absin(C)2=sqrt(P(P-a)(P-b)(P-c))

3. 中线 Ma=sqrt(2(b^2+c^2)-a^2)2=sqrt(b^2+c^2+2bccos(A))2

4. 角平分线
Ta=sqrt(bc((b+c)^2-a^2))(b+c)=2bccos(A2)(b+c)

5. 高线 Ha=bsin(C)=csin(B)=sqrt(b^2-((a^2+b^2-c^2)(2a))^2)

6. 内切圆半径 r=SP=asin(B2)sin(C2)sin((B+C)2)


=4Rsin(A2)sin(B2)sin(C 2)=sqrt((P-a)(P-b)(P-c)P)

=Ptan(A2)tan(B2)tan(C2)

7. 外接圆半径
R=abc(4S)=a(2sin(A))=b(2sin(B))=c(2sin(C))



四边形:
10 28



D1,D2为对角线,M对角线中点连线,A为对角线夹角

1. a^2+b^2+c^2+d^2=D1^2+D2^2+4M^2

2. S=D1D2sin(A)2

(以下对圆的内接四边形)

3. ac+bd=D1D2

4. S=sqrt((P-a)(P-b)(P-c)(P-d)),P为半周长



正n边形:

R为外接圆半径,r为内切圆半径

1. 中心角 A=2PIn

2. 内角 C=(n-2)PIn

3. 边长 a=2sqrt(R^2-r^2)=2Rsin(A2)=2rtan(A2)

4. 面积 S=nar2=nr^2tan(A2)=nR^2sin(A)2=na^2(4tan(A2))



圆:

11 28


1. 弧长 l=rA

2. 弦长 a=2sqrt(2hr-h^2)=2rsin(A2)

3. 弓形高 h=r-sqrt(r^2-a^24)=r(1-cos(A2))=atan(A4)2

4. 扇形面积 S1=rl2=r^2A2

5. 弓形面积 S2=(rl-a(r-h))2=r^2(A-sin(A))2



棱柱:

1. 体积 V=Ah,A为底面积,h为高

2. 侧面积 S=lp,l为棱长,p为直截面周长

3. 全面积 T=S+2A



棱锥:

1. 体积 V=Ah3,A为底面积,h为高

(以下对正棱锥)

2. 侧面积 S=lp2,l为斜高,p为底面周长

3. 全面积 T=S+A
12 28





棱台:

1. 体积 V=(A1+A2+sqrt(A1A2))h3,A1.A2为上下底面积,h为高

(以下为正棱台)

2. 侧面积 S=(p1+p2)l2,p1.p2为上下底面周长,l为斜高

3. 全面积 T=S+A1+A2



圆柱:

1. 侧面积 S=2PIrh

2. 全面积 T=2PIr(h+r)

3. 体积 V=PIr^2h



圆锥:

1. 母线 l=sqrt(h^2+r^2)

2. 侧面积 S=PIrl

13 28


3. 全面积 T=PIr(l+r)

4. 体积 V=PIr^2h3



圆台:

1. 母线 l=sqrt(h^2+(r1-r2)^2)

2. 侧面积 S=PI(r1+r2)l

3. 全面积 T=PIr1(l+r1)+PIr2(l+r2)

4. 体积 V=PI(r1^2+r2^2+r1r2)h3



球:

1. 全面积 T=4PIr^2

2. 体积 V=4PIr^33



球台:

1. 侧面积 S=2PIrh

2. 全面积 T=PI(2rh+r1^2+r2^2)
14 28



3. 体积 V=PIh(3(r1^2+r2^2)+h^2)6



球扇形:

1. 全面积 T=PIr(2h+r0),h为球冠高,r0为球冠底面半径

2. 体积 V=2PIr^2h3

1.3 多边形
#include

#include

#define MAXN 1000

#define offset 10000

#define eps 1e-8

#define zero(x) (((x)>0?(x):-(x))
#define _sign(x) ((x)>eps?1:((x)<-eps?2:0))

struct point{double x,y;};

struct line{point a,b;};


15 28



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,s[3]={1,1,1};

for (i=0;i

s[_sign(xmult(p[(i+1)%n],p[(i+2)%n],p[i]))]=0;

return s[1]|s[2];

}



判定凸多边形,顶点按顺时针或逆时针给出,不允许相邻边共线

int is_convex_v2(int n,point* p){

16 28


int i,s[3]={1,1,1};

for (i=0;i

s[_sign(xmult(p[(i+1)%n],p[(i+2)%n],p[i]))]=0;

return s[0]&&s[1]|s[2];

}



判点在凸多边形内或多边形边上,顶点按顺时针或逆时针给出

int inside_convex(point q,int n,point* p){

int i,s[3]={1,1,1};

for (i=0;i
s[_sign(xmult(p[(i+1)%n],q,p[i]))]=0;

return s[1]|s[2];

}



判点在凸多边形内,顶点按顺时针或逆时针给出,在多边形边上返
回0
17 28



int inside_convex_v2(point q,int n,point* p){

int i,s[3]={1,1,1};

for (i=0;i
s[_sign(xmult(p[(i+1)%n],q,p[i]))]=0;

return s[0]&&s[1]|s[2];

}



判点在任意多边形内,顶点按顺时针或逆时针给出

on_edge表示点在多边形边上时的返回值,offset为多边形坐标上


int inside_polygon(point q,int n,point* p,int on_edge=1){

point q2;

int i=0,count;

while (i
for
(count=i=0,q2.x=rand()+o ffset,q2.y=rand()+offset;i
18 28


if
(zero(xmult (q,p[i],p[(i+1)%n]))&&(p[i].x-q.x)*(p[(i+1)%n].x-q.x)
return on_edge;

else if (zero(xmult(q,q2,p[i])))

break;

else if
( xmult(q,p[i],q2)*xmult(q,p[(i+1)%n],q2)<-eps&&xmul t(p[i],q
,p[(i+1)%n])*xmult(p[i],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){
19 28



return
zero(xmult(p,l1,l2))&&(l1.x-p.x)*(l2.x- p.x)*(l2.y-p.y)
}



判线段在任意多边形内,顶点按顺时针或逆时针给出,与边界相交
返回1

int inside_polygon(point l1,point l2,int n,point* p){

point t[MAXN],tt;

int i,j,k=0;

if (!inside_polygon(l1,n,p)||!inside_polygon(l2,n,p ))

return 0;

for (i=0;i
if
(o pposite_side(l1,l2,p[i],p[(i+1)%n])&&opposite_side (p[i],p
[(i+1)%n],l1,l2))

return 0;

20 28


else if (dot_online_in(l1,p[i],p[(i+1)%n]))

t[k++]=l1;

else if (dot_online_in(l2,p[i],p[(i+1)%n]))

t[k++]=l2;

else if (dot_online_in(p[i],l1,l2))

t[k++]=p[i];

for (i=0;i
for (j=i+1;j
tt.x=(t[i].x+t[j].x)2;

tt.y=(t[i].y+t[j].y)2;

if (!inside_polygon(tt,n,p))

return 0;

}

return 1;

}


21 28



point intersection(line u,line v){

point ret=u.a;

double
t=((u.a.x-v.a.x)*(v.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;

22 28


v.a.x=(a.x+c.x)2;

v.a.y=(a.y+c.y)2;

v.b=b;

return 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;i
if (fabs(t2=xmult(p[0],p[i],p[i+1]))>eps){

t=barycenter(p[0],p[i],p[i+1]);

ret.x+=t.x*t2;
23 28



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

#define zero(x) (((x)>0?(x):-(x))
struct point{double x,y;};



double xmult(point p1,point p2,point p0){
24 28



return
(p1.x-p0.x)*(p2. y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);

}



int same_side(point p1,point p2,point l1,point l2){

return xmult(l1,p1,l2)*xmult(l1,p2,l2)>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;
25 28



}



将多边形沿l1,l2确定的直线切割在side侧切割,保证l1,l2,side
不共线

void polygon_cut(int& n,point* p,point l1,point l2,point
side){

point pp[100];

int m=0,i;

for (i=0;i
if (same_side(p[i],side,l1,l2))

pp[m++]=p[i];

if
(!same _side(p[i],p[(i+1)%n],l1,l2)&&!(zero(xmult(p[i],l1 ,l2
))&&zero(xmult(p[(i+1)%n],l1,l2))))


pp[m++]=intersection(p[i],p[(i+1)%n],l1,l2);

}

for (n=i=0;i26 28



if
(!i||!zero(pp[i].x-pp[i-1].x)||!zero(pp[i]. y-pp[i-1].y))

p[n++]=pp[i];

if (zero(p[n-1].x-p[0].x)&&zero(p[n-1].y-p[0].y))

n--;

if (n<3)

n=0;

}

1.5 浮点函数
浮点几何函数库

#include

#define eps 1e-8

#define zero(x) (((x)>0?(x):-(x))
struct point{double x,y;};

struct line{point a,b;};



27 28


计算cross product (P1-P0)x(P2-P0)

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);

}

double xmult(double x1,double y1,doubl

28 28

dnf新年活动-chambermaid


护肤品排行榜10前-历年诺贝尔奖获得者


重症监护室-火车站买票提前几天


温州旅游-缩句练习题及答案


7年级上册英语-自考资料


男人服饰-为什么要


猪年祝福词-致敬英雄图片


秃鸡散-漫画的启示作文500字