• G. Xor-MST(边权为俩点值的异或值,求MST)


    题:https://codeforces.com/problemset/problem/888/G

    模板题

    #include<bits/stdc++.h>
    using namespace std;
    #define pb push_back
    #define MP make_pair
    typedef long long ll;
    const int mod=1e9+7;
    const int M=2e5+5;
    const int inf=0x3f3f3f3f;
    const ll INF=1e18;
    int a[M],trie[M*32][2];
    int pos[M*32];
    vector<int>v[M];
    int tot=1;
    ll ans=0;
    void pn(){
        cout<<"NO"<<'
    ';
    }
    void py(){
        cout<<"YES"<<'
    ';
    }
    void add(int x,int id){
        int now=1;
        for(int i=30;i>=0;i--){
            if(!trie[now][(1&(x>>i))])
                trie[now][(1&(x>>i))]=++tot;
            now=trie[now][(1&(x>>i))];
        }
        pos[now]=id;
        v[id].pb(x);
    }
    ll query(int x,int rt,int dep){
        ll res=1<<dep;
        for(int i=dep-1;i>=0;i--){
            int nex=trie[rt][(1&(x>>i))];
            if(!nex){
                nex=trie[rt][1^(1&(x>>i))];
                res|=(1<<i);
            }
            rt=nex;
        }
        return res;
    }
    void dfs(int rt,int dep){
        if(!rt||!dep)
            return ;
        int lson=trie[rt][0];
        int rson=trie[rt][1];
        dfs(lson,dep-1);
        dfs(rson,dep-1);
        if(!lson||!rson){///没有分支了,说明只剩一个集合了
            pos[rt]=pos[lson+rson];
            return ;
        }
        int rid=pos[rson],lid=pos[lson];
        if(v[rid].size()>v[lid].size()){
            swap(rid,lid);
            swap(rson,lson);
        }
        ll tmp=1<<30;
        int m=v[rid].size();
        for(int i=0;i<m;i++){
            tmp=min(tmp,query(v[rid][i],lson,dep-1));
            v[lid].pb(v[rid][i]);
        }
        v[rid].clear();
        ans+=tmp;
        pos[rt]=lid;
    }
    int main(){
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        sort(a+1,a+1+n);
        add(a[1],1);
        for(int i=2;i<=n;i++){
            if(a[i-1]!=a[i])
                add(a[i],i);
        }
        dfs(1,31);
        printf("%lld
    ",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    android学习计划
    Android源码下载及开发环境的搭建
    I2C总线时序
    I2C原理和实例
    sql语句获取字段扩展属性
    浏览器兼容:火狐不支持webq格式图片
    js节流函数中的参数传递
    分享插件使用
    图片等比例自适应填充
    window.event在IE和Firefox的异同
  • 原文地址:https://www.cnblogs.com/starve/p/13409040.html
Copyright © 2020-2023  润新知