• CF888G Xor-MST


    题目描述:

    luogu

    题解:

    $01Trie$上启发式合并。

    容易证明将所有点按$a$值扔到$01Trie$中之后,对于一个非叶节点,左右儿子间只建一条边最优。

    所以按$a$排序插到$Trie$里,最后枚举所有有左右儿子的非叶节点对答案的贡献即可。

    实现的时候启发式合并一下。

    代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int N = 200050;
    const int M = 80*N;
    template<typename T>
    inline void read(T&x)
    {
        T f = 1,c = 0;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();}
        x = f*c;
    }
    int n,a[N];
    struct Trie
    {
        int tot,rt,ch[M][2],l[M],r[M];
        void insert(int&u,int d,int i)
        {
            if(!u)u=++tot;
            if(!l[u])l[u]=i;r[u]=i;
            if(d<0)return ;
            insert(ch[u][(a[i]>>d)&1],d-1,i);
        }
        int query(int u,int d,int k)
        {
            if(!u)return 0;
            if(d<0)return 0;
            int c = ((k>>d)&1);
            if(ch[u][c])return query(ch[u][c],d-1,k);
            else return query(ch[u][!c],d-1,k)+(1<<d);
        }
        ll sol(int x,int d)
        {
            if(!x)return 0;
            if(d<0)return 0;
            if(ch[x][0]&&ch[x][1])
            {
                int u = ch[x][0],v = ch[x][1];
                if(r[u]-l[u]>r[v]-l[v])swap(u,v);
                int ans = 0x3f3f3f3f;
                for(int i=l[u];i<=r[u];i++)
                    ans = min(ans,query(v,d-1,a[i]));
                return ans+(1ll<<d)+sol(ch[x][0],d-1)+sol(ch[x][1],d-1);
            }
            if(ch[x][0])return sol(ch[x][0],d-1);
            else return sol(ch[x][1],d-1);
        }
    }tr;
    int main()
    {
    //    freopen("tt.in","r",stdin);
        read(n);
        for(int i=1;i<=n;i++)read(a[i]);
        sort(a+1,a+1+n);
        for(int i=1;i<=n;i++)tr.insert(tr.rt,29,i);
        printf("%lld
    ",tr.sol(1,29));
        return 0;
    }
    View Code
  • 相关阅读:
    MySQL热备脚本
    从库查看状态的时候显示“ Last_Error”
    Jenkins+svn+maven
    confluence的安装、备份和恢复(wiki)
    RAP在centos上的部署
    不停止MySQL服务的情况下修改root的密码
    给Linux装图形化界面
    大文件传输工具
    MySQL server PID file could not be found!
    find常见用法
  • 原文地址:https://www.cnblogs.com/LiGuanlin1124/p/11116465.html
Copyright © 2020-2023  润新知