acm模板byliyang.docx
- 文档编号:11750068
- 上传时间:2023-03-31
- 格式:DOCX
- 页数:59
- 大小:28.17KB
acm模板byliyang.docx
《acm模板byliyang.docx》由会员分享,可在线阅读,更多相关《acm模板byliyang.docx(59页珍藏版)》请在冰豆网上搜索。
acm模板byliyang
【正整数】
intgetint(){
charc=getchar();
intt=0;
while(c<'0'||c>'9'){
c=getchar();
}
while(c>='0'&&c<='9'){
t=t*10+c-'0';
c=getchar();
}
returnt;
}
【含负数】
intgetint(){
intt=0,flag=1;
charc=getchar();
while(c<'0'||c>'9'||c=='-'){
if(c=='-')
flag=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
t=t*10+c-'0';
c=getchar();
}
returnt*flag;
}
【常用头文件】
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
【矩阵乘法】
A+A^2+A^3+…..+A^K
intn;
structMat{
intnum[38][38];
voidZreo(){
memset(num,0,sizeof(num));
}
voiddig_One(){
memset(num,0,sizeof(num));
for(inti=1;i<=n;i++)
num[i][i]=1;
}
};
intMod;
Matadd(MatA,MatB){
Matans;
for(inti=1;i<=n;i++)
for(intj=1;j<=n;j++)
ans.num[i][j]=(A.num[i][j]+B.num[i][j])%Mod;
returnans;
}
Matmult(MatA,MatB){
Matans;
ans.Zreo();
for(inti=1;i<=n;i++)
for(intj=1;j<=n;j++)
for(intk=1;k<=n;k++){
ans.num[i][j]=(ans.num[i][j]+A.num[i][k]*B.num[k][j])%Mod;
}
returnans;
}
Matmy_pow(Matx,inty){
Matans;
ans.dig_One();
for(;y;y>>=1){
if(y&1)
ans=mult(ans,x);
x=mult(x,x);
}
returnans;
}
MatA;//全局变量
Matget_sum(intk){//计算A+A^2+A^3+…..+A^K
if(k==1)
returnA;
elseif(k&1)
returnadd(get_sum(k-1),my_pow(A,k));
else{
MatB=get_sum(k>>1);
returnadd(B,mult(B,my_pow(A,k>>1)));
}
}
【KM二分最佳匹配】
constintsize=10008;
constintinf=100000000;
intgrid[size][size];
intlx[size],ly[size];
intn,m;//n,m集合X,Y的元素个数
boolvisited_x[size],visited_y[size];
intmatch[size];
booldfs(intu){
visited_x[u]=1;
for(intv=1;v<=m;v++){
if(!
visited_y[v]&&lx[u]+ly[v]==grid[u][v]){
visited_y[v]=1;
if(match[v]==-1||dfs(match[v])){
match[v]=u;
return1;
}
}
}
return0;
}
intKM(inttype){//type=0最小权值匹配,type=1最大权值匹配
inti,j,k,sum=0;
if(type==0){
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
grid[i][j]=-grid[i][j];
}
memset(ly,0,sizeof(ly));
for(i=1;i<=n;i++){
lx[i]=-inf;
for(j=1;j<=m;j++)
lx[i]=max(lx[i],grid[i][j]);
}
memset(match,-1,sizeof(match));
for(intk=1;k<=n;k++){
while
(1){
memset(visited_x,0,sizeof(visited_x));
memset(visited_y,0,sizeof(visited_y));
if(dfs(k))
break;
intd=inf;
for(i=1;i<=n;i++){
if(visited_x[i]){
for(j=1;j<=m;j++){
if(!
visited_y[j])
d=min(d,lx[i]+ly[j]-grid[i][j]);
}
}
}
if(d==inf)
return-1;
for(i=1;i<=n;i++){
if(visited_x[i])
lx[i]-=d;
}
for(i=1;i<=m;i++){
if(visited_y[i])
ly[i]+=d;
}
}
}
for(i=1;i<=m;i++){
if(match[i]!
=-1)
sum+=grid[match[i]][i];
}
returntype?
sum:
-sum;
}
【spfa()差分约束系统】
//加入超级大原点
constintsize=1008;
structEdge{
intv;
intw;
intnext;
}edge[2*10008];
intvec[size],id,in_time[size],dist[size];
constintinf=INT_MAX;
inlinevoidadd_edge(intu,intv,intw){
edge[id].v=v;
edge[id].w=w;
edge[id].next=vec[u];
vec[u]=id++;
}
voidinit(){
memset(vec,-1,sizeof(vec));
id=0;
memset(in_time,0,sizeof(in_time));
}
intn;
boolin_que[size];
intspfa(ints){
inti,j,u,v;
for(i=1;i<=n;i++)
dist[i]=inf,in_que[i]=0;
dist[s]=0;
in_que[s]=1;
in_time[s]++;
queue
que.push(s);
while(!
que.empty()){
u=que.front();
que.pop();
in_que[u]=0;
for(inte=vec[u];e!
=-1;e=edge[e].next){
v=edge[e].v;
if(dist[v]>dist[u]+edge[e].w){
dist[v]=dist[u]+edge[e].w;
if(!
in_que[v]){
in_que[v]=1;
in_time[v]++;
if(in_time[v]>n)//必须>
return-1;
que.push(v);
}
}
}
}
returndist[n]==inf?
-2:
dist[n];
}
intmain(){
inti,ml,md,a,b,w;
scanf("%d%d%d",&n,&ml,&md);
init();
for(i=1;i<=ml;i++){
scanf("%d%d%d",&a,&b,&w);
add_edge(a,b,w);
}
for(i=1;i<=md;i++){
scanf("%d%d%d",&a,&b,&w);
add_edge(b,a,-w);
}
printf("%d\n",spfa
(1));
return0;
}
【tarjan算法缩点最长路】
usingnamespacestd;
constintsize=150010;
structEDGE{
intv;
intnext;
}edge[size];
intid;
intvec[size],mystack[size],top;
intlow[size],dfn[size],idx,num;
boolinstack[size];
intbelong[size];
inlinevoidadd_edge(intu,intv){
edge[id].v=v;
edge[id].next=vec[u];
vec[u]=id++;
}
intsum[size];
ints,start;
voidtarjan(intu){
low[u]=dfn[u]=idx++;
mystack[++top]=u;
instack[u]=1;
for(inte=vec[u];e!
=-1;e=edge[e].next){
intv=edge[e].v;
if(dfn[v]==-1){
tarjan(v);
low[u]=min(low[u],low[v]);}
elseif(instack[v])
low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
intv;
num++;
do{
v=mystack[top--];
instack[v]=0;
belong[v]=num;
if(v==s)
start=num;
sum[num]++;
}while(v!
=u);
}
}
voidinit(){
idx=1;
top=-1;
num=0;
id=0;
memset(dfn,-1,sizeof(dfn));
memset(vec,-1,sizeof(vec));
memset(instack,0,sizeof(instack));
memset(sum,0,sizeof(sum));
}
intn;
structNEWEDGE{
intv;
intnext;
}new_edge[size];
intnew_link[size],new_id;
inlinevoidadd_new_edge(intu,intv){
new_edge[new_id].v=v;
new_edge[new_id].next=new_link[u];
new_link[u]=new_id++;
}
intdist[size];
intmain(){
inti,j,m,u,v,cas=1;
while(scanf("%d%d%d",&n,&m,&s)!
=EOF){
init();
while(m--){
scanf("%d%d",&u,&v);
if(u==v)
continue;
add_edge(u,v);
}
for(i=1;i<=n;i++){
if(dfn[i]==-1)
tarjan(i);
dist[i]=0;
}
new_id=0;
memset(new_link,-1,sizeof(new_link));
for(u=1;u<=n;u++){
for(inte=vec[u];e!
=-1;e=edge[e].next){
v=edge[e].v;
if(belong[u]!
=belong[v]){
add_new_edge(belong[u],belong[v]);
}
}
}
queue
intvisited[size];
memset(visited,0,sizeof(visited));
que.push(start);
dist[start]=sum[start];
visited[start]=1;
intans=dist[start];
while(!
que.empty()){
u=que.front();
que.pop();
visited[u]=0;
for(inte=new_link[u];e!
=-1;e=new_edge[e].next){
v=new_edge[e].v;
if(dist[v] dist[v]=dist[u]+sum[v]; ans=max(ans,dist[v]); if(! visited[v]) que.push(v); } } } printf("Case%d: \n",cas++); printf("%d\n",ans); } return0; } 【二分图判定/黑白染色】 structEDGE{ intv; intnext; }edge[2000010]; intcolor[1010]; intvec[1010]; intn,m,id,flag; inlinevoidaddedge(intu,intv){ edge[id].v=v; edge[id].next=vec[u]; vec[u]=id; id++;} voiddfs(intu,intcolor_type){ color[u]=color_type; for(inte=vec[u];e! =-1;e=edge[e].next){ intv=edge[e].v; if(color[v]==0) dfs(v,3-color_type); elseif(color[v]==color[u]){ flag=0; return;} } } intmain(){ intt,i,j,u,v,cas; scanf("%d",&t); for(cas=1;cas<=t;cas++){ memset(color,0,sizeof(color)); memset(vec,-1,sizeof(vec)); id=0;flag=1; scanf("%d%d",&n,&m); while(m--){ scanf("%d%d",&u,&v); addedge(u,v);addedge(v,u);} for(i=1;i<=n;i++){ if(color[i]==0){ dfs(i,1);}} if(flag) printf("Yes\n"); } 【二分最大匹配】 constintsize=508; structNode{ intleft; intright; }girl[size]; intboy[size]; intgirl_n,boy_m; boolgrid[size][size]; boolvisited[size]; intmatch[size],cx[size]; intdfs(intu){ for(intv=1;v<=boy_m;v++){ if(grid[u][v]&&! visited[v]){ visited[v]=1; if(match[v]==-1||dfs(match[v])){ match[v]=u; cx[u]=v; return1; } } } return0; } intmax_match(){ intans=0; memset(match,-1,sizeof(match)); memset(cx,-1,sizeof(cx)); for(inti=1;i<=girl_n;i++){ if(cx[i]==-1){ memset(visited,0,sizeof(visited)); ans+=dfs(i); } } returnans;} intmain(){ inti,j,x,y; while(scanf("%d%d",&girl_n,&boy_m)! =EOF){ for(i=1;i<=girl_n;i++){ scanf("%d%d",&x,&y); if(x>y) swap(x,y); girl[i].left=x; girl[i].right=y; } for(i=1;i<=boy_m;i++) scanf("%d",&boy[i]); memset(grid,0,sizeof(grid)); for(i=1;i<=girl_n;i++) for(j=1;j<=boy_m;j++){ if(girl[i].left<=boy[j]&&boy[j]<=girl[i].right) grid[i][j]=1; } printf("%d\n",max_match()); } return0; } 【map[string,string]手写】 structnode{ charname[25]; charfun[85]; friendbooloperator<(constnode&a,constnode&b){ returnstrcmp(a.name,b.name)<0; } }names[N]; intk; intfind_name(char*name){ intleft=0,right=k-1,mid; while(left<=right){ mid=(left+right)>>1; if(strcmp(names[mid].name,name)==0) returnmid; elseif(strcmp(names[mid].name,name)>0) right=mid-1; elseif(strcmp(names[mid].name,name)<0) left=mid+1; } return-1;} 【double二分】注意eps的选择 constintsize=108; constdoubletwo_PI=2.0*acos(-1.0); doubledist[size]; intn; doubleradian(doublea,doubleb,doublec){ returnacos((a*a+b*b-c*c)/(2.0*a*b)); } doubleSUM_AGE(doublec){ doublesum=0.0; for(inti=0;i sum+=radian(dist[i],dist[i+1],c); returnsum; } constdoubleeps=1e-8; intmain(){ intt,i,j; doubleleft,right,mid,ans; //0printf("%.10lf",eps); scanf("%d",&t); for(intcas=1;cas<=t;cas++){ scanf("%d",&n); for(i=0;i scanf("%lf",&dist[i]); dist[n]=dist[0]; right=1000000000.0; left=0.0; for(i=0;i right=min(dist[i]+dist[i+1],right); left=max(fabs(dist[i]-dist[i+1]),left); } ans=0; while(right-left>eps){ mid=(left+right)/2.0; if(fabs(SUM_AGE(mid)-two_PI) ans=mid; break; } elseif(SUM_AGE(mid)>two_PI) right=mid; else left=mid; } printf("Case%d: ",cas); if(fabs(SUM_AGE(ans)-two_PI) printf("%.3lf\n",ans); else printf("impossible\n"); } return0; } doubleside[108]; intn; doublePI=3.141592654; inlinedoubleMax(doublex,doubley){ returnx>y? x: y; } doublejudge(doubler){ doublesum=0.0; doublelen=2.0*r*sin(PI/n); inti; for(i=0;i if(side[i]+side[i+1] return4.0*PI; doubletemp=(side[i]*side[i]+side[i+1]*side[i+1]-le
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- acm 模板 byliyang