ACM 新手模板.docx
- 文档编号:24168810
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:57
- 大小:27.81KB
ACM 新手模板.docx
《ACM 新手模板.docx》由会员分享,可在线阅读,更多相关《ACM 新手模板.docx(57页珍藏版)》请在冰豆网上搜索。
ACM新手模板
一般:
d=a;
for(i=2;i<=b;i++)
d=d%n*a;
d=d%n;
当b较大时,将b转为二进制来提高效率
intmodular_exponentiation(inta,intb,intn)
{
intd,t;
d=1;
t=a;
while(b>0)
{
if(b%2==1)
d=d*t%n;
b=b/2;t=t*t%n;
}
returnd;
}
素数测试
#include
usingnamespacestd;
intmodular_exponentiation(inta,intb,intn)
{
intd,t;
d=1;
t=a;
while(b>0)
{
if(b%2==1)
d=d*t%n;
b=b/2;t=t*t%n;
}
returnd;
}
intmiller_babin(intn,ints)
{
inti,a;
for(i=1;i<=s;i++)
{
a=rand()%(n-2)+1;
if(modular_exponentiation(a,n-1,n)!
=1)
return0;
}
return1;
}
intmain()
{intn;
cin>>n;
if(miller_babin(n,30))
cout<<"YES"< else cout<<"NO"< return0; } SPFA #include #include usingnamespacestd; constlongMAXN=10000; constlonglmax=0x7FFFFFFF; typedefstruct { longv; longnext; longcost; }Edge; Edgee[MAXN]; longp[MAXN]; longDis[MAXN]; boolvist[MAXN]; queue longm,n;//点,边 voidinit() { longi; longeid=0; memset(vist,0,sizeof(vist)); memset(p,-1,sizeof(p)); fill(Dis,Dis+MAXN,lmax); while(! q.empty()) {q.pop();} for(i=0;i {longfrom,to,cost; scanf("%ld%ld%ld",&from,&to,&cost); e[eid].next=p[from]; e[eid].v=to; e[eid].cost=cost; p[from]=eid++; //以下适用于无向图 swap(from,to); e[eid].next=p[from]; e[eid].v=to; e[eid].cost=cost; p[from]=eid++; } } voidprint(longEnd) {//若为lmax则不可达 printf("%ld\n",Dis[End]);} voidSPF() {init(); longStart,End; scanf("%ld%ld",&Start,&End); Dis[Start]=0; vist[Start]=true; q.push(Start); while(! q.empty()) { longt=q.front(); q.pop(); vist[t]=false; longj; for(j=p[t];j! =-1;j=e[j].next) { longw=e[j].cost; if(w+Dis[t] { Dis[e[j].v]=w+Dis[t]; if(! vist[e[j].v]) { vist[e[j].v]=true; q.push(e[j].v); } } } } print(End); } intmain() { while(scanf("%ld%ld",&m,&n)! =EOF) { SPF(); } return0; } priority_queuedijkstra #include #include usingnamespacestd; typedefpair intn,m; intfirst[500],u[500],v[500],w[500],next[500],d[500]; priority_queue voidread_graph() { cin>>n>>m; for(inti=0;i<=n;i++) first[i]=-1;//初始化表头 for(inte=1;e<=m;e++) { cin>>u[e]>>v[e]>>w[e]; next[e]=first[u[e]]; first[u[e]]=e;//反向插入 } } intmain() { inti,j,k,done[500]; read_graph(); for(i=0;i<=n;i++) d[i]=9999;//初始化为最大 d[5]=0;//假设起点为结点5 memset(done,0,500); q.push(make_pair(d[5],5)); while(! q.empty()) {piiu=q.top(); q.pop(); intx=u.second; if(done[x]) continue; done[x]=1; for(inte=first[x];e! =-1;e=next[e]) if(d[v[e]]>d[x]+w[e]) { d[v[e]]=d[x]+w[e]; q.push(make_pair(d[v[e]],v[e])); } } for(i=1;i<=n;i++) cout< return0; } 几何 #include #include usingnamespacestd; #defineE0.00001 typedefstruct { pointp1,p2; }segment; typedefstruct { doublea; doubleb; doublec; }line; typedefstruct { doubley; doublex; }point; voidpoint_to_line(pointp1,pointp2,line*l)//两点转为直线 { if(p1.x==p2.x) { l->a=1; l->b=0; l->c=-p1.x; } else {l->b=1; l->a=-(p1.y-p2.y)/(p1.x-p2.x); l->c=-(l->a*p1.x)-(l->b*p1.y);} } voidpoint_slope_to_line(pointp,doublem,line*l) { l->a=-m; l->b=1; l->c=-((l->a*p.x)+(l->b*p.y)); } //判断平行或相同 intparallelQ(linel1,linel2) { return((fabs(l1.a-l2.a)<=E)&&(fabs(l1.b-l2.b)<=E)); } intsame_lineQ(linel1,linel2) { return(parallelQ(l1,l2)&&(fabs(l1.c-l2.c)<=E)); } //求交点 voidintersection_point(linel1,linel2,point*p) { //当不为同一直线或平行时再求交点,省略了判断 p->x=(l2.b*l1.c-l1.b*l2.c)/(l2.a*l1.b-l1.a*l2.b); if(fabs(l1.b)>E)//testforverticalline p->y=-(l1.a*p->x+l1.c)/l1.b; else p->y=-(l2.a*p->x+l2.c)/l2.b; } //线段是否相交 doublemulti(pointa,pointb,pointo)//判断a在bo的哪侧 { return(a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y); } 如果ab分别在bo两侧且bo分别在ab两侧则线段相交 只考虑一条时则为线段与直线相交 相交时,将线段化为直线求交点 voidclosest_point(pointp_in,linel,point*p_c) { lineperp;//l的过xy的垂线 if(fabs(l.b)<=E)//垂线 { p_c->x=-l.c; p_c->y=p_in.y; return; } if(fabs(l.a)<=E) { p_c->x=p_in.x; p_c->y=-l.c; return; } point_slope_to_line(p_in,1/l.a,&perp); intersection_point(l,perp,p_c); } intmain() { inti,j; linel1,l2; pointp; pointp1,p2,p3,p4; /* cin>>p1.y>>p1.x; cin>>p2.y>>p2.x; cin>>p3.y>>p3.x; cin>>p4.y>>p4.x; point_to_line(p1,p2,&l1); point_to_line(p3,p4,&l2); */ /* cin>>l1.a>>l1.b>>l1.c; cin>>l2.a>>l2.b>>l2.c; intersection_point(l1,l2,&p); */ /* 求点到直线的垂足(点到线的距离) cin>>l1.a>>l1.b>>l1.c; cin>>p1.y>>p1.x; closest_point(p1,l1,&p); */ cout< return0; } 凸包 #include #include #include #defineeps1e-3 usingnamespacestd; structpoint { doublex,y; }p[1010],result[1010]; intN,L; doublecross(pointa,pointb,pointc) { return(b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x); } doubledist(pointa,pointb) { return(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); } boolcmp(pointa,pointb) { if(cross(p[0],a,b)==0) returndist(p[0],a) elsereturncross(p[0],a,b)>0; } intmain() { inti,j; scanf("%d%d",&N,&L); intfirst=0; for(i=0;i { scanf("%lf%lf",&p[i].x,&p[i].y); } for(i=1;i { if(p[i].y first=i; } result[0]=p[first]; p[first]=p[0]; p[0]=result[0]; sort(p+1,p+N,cmp); inttop=1; result[0]=p[0]; result[1]=p[1]; for(i=2;i {//cross()<0时会把同线上的点算在内 while(top>=1&&cross(result[top-1],result[top],p[i])<=0) top--; result[++top]=p[i]; } doublelen=0; top++; result[top]=result[0]; for(i=0;i { len+=sqrt(dist(result[i],result[i+1])); } for(i=0;i area=area+result[i+1].y*result[i].x-result[i].y*result[i+1].x;//计算面积 if(area<0) area=-area; area=area/2; return0; } //真正的实现逆时针排序 将p备份到p2 boolcmpp(pointa,pointb) { if(cross(cmppoint,a,b)==0) returndist(cmppoint,a) elsereturncross(cmppoint,a,b)>0; } for(i=1;i { cmppoint=p2[i-1]; sort(p2+i,p2+N,cmpp); } 判断点是否在多边形内部 #include usingnamespacestd; #defineeps1.0e-5 inlinedoublemax(doublea,doubleb){returna>b? a: b;} inlinedoublemin(doublea,doubleb){returna a: b;} inlinedoubledabs(doublea){returna<0? -a: a;} structPoint{ doublex,y; }; Pointpoly[110]; intn,m; boolonline(constPoint&p1,constPoint&p2,constPoint&p3){ if(p2.x>=min(p1.x,p3.x)&&p2.x<=max(p1.x,p3.x) &&p2.y>=min(p1.y,p3.y)&&p2.y<=max(p1.y,p3.y)){ if(dabs((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y))<=eps) returntrue; } returnfalse; } boolinsidepolygon(Pointp){ intcounter=0; doublexinters; Pointp1,p2; p1=poly[0]; for(inti=1;i<=n;i++){ p2=poly[i%n]; if(online(p1,p,p2))returntrue; if(p.y>min(p1.y,p2.y)){ if(p.y<=max(p1.y,p2.y)){ if(p.x<=max(p1.x,p2.x)){ if(p1.y! =p2.y){ xinters=(p.y-p1.y)*(p2.x-p1.x)/(p2.y-p1.y)+p1.x; if(p1.x==p2.x||p.x<=xinters)counter++; } } } } p1=p2; } if(counter%2==0) returnfalse; returntrue; } intmain(){ intt=0; Pointp; while(cin>>n){ if(n==0)break; if(t++>0)cout< cout<<"Problem"< "< cin>>m; for(inti=0;i cin>>poly[i].x>>poly[i].y; for(inti=0;i cin>>p.x>>p.y; if(insidepolygon(p)) cout<<"Within"< else cout<<"Outside"< } } return0; } KMP #defineMaxStrLen11000 #include #include usingnamespacestd; chars1[MaxStrLen],s2[MaxStrLen],s3[MaxStrLen],p[11000]; intnext[110000]; voidinput(); intIndex_KMP(char*s,char*t,intpos,intnext[]); voidget_next(char*s,intnext[]); voidoutput(); main() { cin>>s1; cin>>p; get_next(p,next); cout< } intIndex_KMP(char*s,char*t,intpos,intnext[]) { inti,j,ls,lt; i=pos-1,j=-1; ls=strlen(s);lt=strlen(t); while(i if(j==-1||s[i]==t[j]){ i++;j++; } else{ j=next[j]-1; } } if(j>=lt)returni-lt+1; elsereturn0; } voidget_next(char*s,intnext[]) { inti,j; i=1;j=0; next[0]=0; while(i { if(j==0||s[i-1]==s[j-1]) { i++;j++; next[i-1]=j; } else j=next[j-1]; } } Bellman_Ford算法: #include #include #include usingnamespacestd; #defineMAX10000 #definemaxn201 ifstreamfin("g.txt"); intg[100][100]; intd[100]; intcount[100]; intp[100]; intn; deque boolBellman_Ford(intk) {Q.push_back(k); intj; d[k]=0; while(! Q.empty()) { inti=Q.front(); Q.pop_front(); count[i]++; if(count[i]>n)returnfalse; for(j=1;j<=n;j++) if(g[i][j]! =0&&d[j]>d[i]+g[i][j]) { d[j]=d[i]+g[i][j]; p[j]=i; Q.push_back(j); } } returntrue; } intmain() { inti,j; fin>>n; memset(count,0,sizeof(count)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) fin>>g[i][j]; memset(d,10000,sizeof(d)); p[1]=0; boolb=Bellman_Ford (1); if(b) {for(i=1;i<=n;i++) { cout<<"1---"< cout< j=i; while(j) { cout< j=p[j]; } cout< } } else cout<<"qw"< return0; } #include #include #include usingnamespacestd; intconstMAXN=256; intconstINF=0xffffff; intN,S,T;//点数、源点、汇点 typedefintGraph[MAXN][MAXN]; typedefintPath[MAXN]; Graphgraph,flow,R; //容量网络、流量网络、残量网络 Pathprev,visit,Q; //前驱、记录是否被访问、广搜队列 intEK() { memset(flow,0,sizeof(flow));//流量清空 for(inti=0;i {//初始残量网络等于原图 copy(graph[i],graph[i]+N,R[i]); } for(;;) { inthead(0),tail(0); memset(visit,fal
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ACM 新手模板 新手 模板
![提示](https://static.bdocx.com/images/bang_tan.gif)