先来份正解
1 int main(){ 2 int a,b; 3 scanf("%d%d",&a,&b); 4 printf("%d",a+b); 5 return 0; 6 }
恶搞开始
Dijkstra
struct Node{ int v,to,next; }e[maxn]; int tot,n,m; int head[maxn],dis[maxn]; bool vis[maxn]; priority_queue<pair<int,int> >q; inline void add(int x,int y,int z){ e[++tot].v=y; e[tot].to=z; e[tot].next=head[x]; head[x]=tot; } inline void dijkstra(int s){ memset(dis,127,sizeof dis); dis[s]=0; q.push(make_pair(0,s)); while(q.size()){ int x=q.top().second; q.pop(); if(vis[x]) continue; vis[x]=true; for(int i=head[x];i;i=e[i].next){ int y=e[i].v,z=e[i].to; if(dis[y]>dis[x]+z){ dis[y]=dis[x]+z; q.push(make_pair(-dis[y],y)); } } } } int main(){ int a=read(),b=read(); add(1,2,a); add(2,3,b); dijkstra(1); printf("%d",dis[3]); return 0; }
Spfa
struct Node{ int v,to,next; }e[maxn]; int tot,n,m; int head[maxn],dis[maxn]; bool vis[maxn]; priority_queue<pair<int,int> >q; inline void add(int x,int y,int z){ e[++tot].v=y; e[tot].to=z; e[tot].next=head[x]; head[x]=tot; } inline void spfa(int s){ queue<int> q; memset(dis,127,sizeof dis); dis[s]=0; vis[s]=true; q.push(s); while(q.size()){ int x=q.front(); q.pop(); vis[x]=false; for(int i=head[x];i;i=e[i].next){ int y=e[i].v,z=e[i].to; if(dis[y]>dis[x]+z){ dis[y]=dis[x]+z; if(!vis[y]) q.push(y),vis[y]=true; } } } } int main(){ int a=read(),b=read(); add(1,2,a); add(2,3,b); spfa(1); return 0; }
Floyd
int n,m; inline void Floyd(){ int dis1[5][5]; for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) dis1[i][j]=inf; dis1[1][2]=n; dis1[2][3]=m; for(int k=1;k<=3;k++) for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) dis1[i][j]=min(dis1[i][j],dis1[i][k]+dis1[k][j]); } int main(){ n=read(); m=read(); Floyd(); printf("%d",dis1[1][3]); return 0; }
前缀和、后缀和
inline void sumq(){ int f[5]={}; for(int i=1;i<=2;i+=){ int x=read(); f[i]=f[i-1]+x; } printf("%d",f[2]); } inline void sumh(){ int f[5]={}; for(int i=2;i>=1;i--){ int x=read(); f[i]=f[i+1]+x; } printf("%d",f[1]); } int main(){ //sumq(); //sumh(); return 0; }
最小生成树
并查集
struct Node{ int x,y,t; inline bool operator<(const Node&x)const{return t<x.t;} }a[10]; int fa[11],ans,k; inline int find(int x){ if(x==fa[x]) return x; return fa[x]=find(fa[x]); } inline void bingchaji(){ for(int i=1;i<=10;i++) fa[i]=i; for(int i=1;i<=2;i++){ a[i].t=read(); a[i].x=i+1; a[i].y=1; k++; } a[++k].x=1; a[k].y=3; a[k].t=inf; sort(a+1,a+k+1); for(int i=1;i<=k;i++){ int x=find(a[i].x),y=find(a[i].y); if(x!=y) fa[x]=y,ans+=a[i].t; } printf("%d",ans); } int main(){ bingchaji(); return 0; }
Prim
位运算
递归版
inline int weiyunsuan_dg(int a,int b){ return b==0?a:weiyunsuan_dg(a^b,(a&b)<<1); } int main(){ int a=read(),b=read(); cout<<weiyunsuan_dg(a,b); return 0; }
非递归版
inline void weiyunsuan_fdg(){ int a=read(),b=read(),x=a&b,y=a^b; while(x){ int s=y; int t=x<<1; x=s&t; y=s^t; } printf("%d",y); } int main(){ weiyunsuan_fdg(); return 0; }
快读、快输版
inline int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch)) {x=x*10+ch-48;ch=getchar();} return x*f; } inline void put(int x){ if(x<0) putchar('-'),x=-x; if(x>9) put(x/10); putchar(x%10+48); return; } int main(){ put(read()+read()); return 0; }
树状数组
int c[5]; inline int ask(int x){ int ans=0; for(;x;x-=x&(-x)) ans+=c[x]; return ans; } inline void add(int x,int y){ while(x<=2){ c[x]+=y; x+=x&(-x); } } int main(){ for(int i=1;i<=2;i++) add(i,read()); int ans=ask(2); printf("%d",ans); return 0; }
LCA
struct Node{ int v,to,next; }e[10]; int fa[10][5]; int head[10],deep[10],tot; bool vis[10]; inline void add(int x,int y,int z){ e[++tot].v=y; e[tot].to=z; e[tot].next=head[x]; head[x]=tot; } inline void bfs(){ queue<int> q; deep[1]=1; q.push(1); vis[1]=true; while(q.size()){ int x=q.front(); q.pop(); for(int i=head[x];i;i=e[i].next){ int y=e[i].v,z=e[i].to; if(!vis[y]){ deep[y]=deep[x]+z; fa[y][0]=x; for(int j=1;j<10;j++) fa[y][j]=fa[fa[y][j-1]][j-1]; vis[y]=true; q.push(y); } } } } inline int Lca(int x,int y){ if(deep[x]<deep[y]) x^=y^=x^=y; for(int i=10;i>=0;i--) if(deep[fa[x][i]]>=deep[y]) x=fa[x][i]; if(x==y) return x; for(int i=10;i>=0;i--) if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i]; return fa[x][0]; } inline int dis(int x,int y){ return deep[x]+deep[y]-2*deep[Lca(x,y)]; } int main(){ add(1,2,read()); add(2,3,read()); bfs(); printf("%d",dis(1,3)); return 0; }
DP
好像和前缀和一样