• Luogu P1001 A+B Problem


     先来份正解

    1 int main(){
    2      int a,b;
    3      scanf("%d%d",&a,&b);
    4      printf("%d",a+b);
    5      return 0;  
    6 }
    001

     恶搞开始

    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;
    }
    Dijkstra

    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;
    }
    Spfa

    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;
    }
    Floyd

    前缀和、后缀和

    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;
    }
    LCA

    DP

    好像和前缀和一样

  • 相关阅读:
    C语言博客作业04--数组
    DS博客作业04--树大作业
    Java课程设计
    JAVA课设-五子棋-团队博客
    yue
    Java扫雷设计
    java课设--五子棋
    软件工程-个人总结
    JAVA课程设计个人博客
    JAVA第09次实验(IO流)
  • 原文地址:https://www.cnblogs.com/cbyyc/p/11512703.html
Copyright © 2020-2023  润新知