zoukankan      html  css  js  c++  java
  • 2019hdu多校 AND Minimum Spanning Tree

    题目链接:Click here

    题目大意:两个点之间的边权为编号按位与的值,求最小生成树,方案要字典序最小

    Solution:

    一道不难的构造题,每个点连向他取反后的lowbit值,这样边权为0,若lowbit值大于n,则连1

    这样自构造出来的必然是最小生成树,且满足字典序最小

    Code:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2e5+1;
    int n,ans=0,a[N];
    int lowbit(int x){return x&(-x);}
    int read(){
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
        while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
        return x*f;
    }
    void solve(){
        int n=read(),ans=0;
        for(int i=2;i<=n;i++){
            int x=lowbit(~i);
            a[i]=x<=n?x:1;
            ans+=(a[i]&i);
        }printf("%d
    ",ans);
        for(int i=2;i<n;i++) printf("%d ",a[i]);
        printf("%d
    ",a[n]);
    }
    int main(){
        int t=read();
        while(t--) solve();
        return 0;
    }
    
  • 相关阅读:
    第二阶段冲刺6
    第二阶段冲刺5
    第二阶段冲刺4
    第二阶段冲刺3
    暑假学习进度七
    暑假学习进度六
    暑假学习进度五
    暑假学习进度四
    暑假学习进度三
    暑假学习进度二
  • 原文地址:https://www.cnblogs.com/NLDQY/p/11291692.html
Copyright © 2011-2022 走看看