I 建通道

该博客讨论了在无垠宇宙中,如何在n个星球之间建立传送通道以实现星际旅行的问题。每个星球有权值v_i,建立通道的费用基于星球权值的异或运算。目标是找到构建所有星球相互可达的最低总成本。博客提供了具体的计算规则和示例,并可能包含解决此问题的算法或代码实现。
摘要由CSDN通过智能技术生成

链接:https://ac.nowcoder.com/acm/contest/3003/I

在无垠的宇宙中,有 n 个星球,第 i 个星球有权值 v_ivi​。
由于星球之间距离极远,因此想在有限的时间内在星际间旅行,就必须要在星球间建立传送通道。
任意两个星球之间均可以建立传送通道,不过花费并不一样。第 i 个星球与第 j 个星球的之间建立传送通道的花费是 \text{lowbit}(v_i\oplus v_j)lowbit(vi​⊕vj​),其中 \oplus⊕ 为二进制异或,而 \text{lowbit}(x)lowbit(x) 为 x 二进制最低位 1 对应的值,例如 \text{lowbit}(5)=1,\text{lowbit}(8)=8lowbit(5)=1,lowbit(8)=8。特殊地,\text{lowbit}(0)=0lowbit(0)=0。
牛牛想在这 n 个星球间穿梭,于是――你需要告诉 牛牛,要使这 n 个星球相互可达,需要的花费最少是多少。

输入描述:

第一行,一个正整数 n 。
第二行,n 个非负整数 v_1,v_2,\dots,v_nv1​,v2​,…,vn​ 。
保证 1\leq n\leq 2\times 10^51≤n≤2×105,0\leq v_i < 2^{30}0≤vi​<230。

输出描述:

输出一行,一个整数表示答案。

示例1

输入

复制

2
1 2

输出

复制

1

说明

\text{}1、21、2 号点之间建立通道,v_1 \oplus v_2=3, \text{lowbit}(3)=1v1​⊕v2​=3,lowbit(3)=1

代码:

#include<bits/stdc++.h>
using namespace std;
long long a[200005],n;
map<long long,long long>vis;
int main()
{
    scanf("%lld",&n);
    for (int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        if (vis[a[i]]) i--,n--;
        vis[a[i]]=1;
    }
    long long ans,c=1;
    if (n==1){
        cout<<"0"<<endl;
        return 0;
    }
    for (int i=1;;i++){
        long long vis0=0,vis1=0;
        for (int j=1;j<=n;j++){
            long long tmp=a[j]&1;
            a[j]/=2;
            if (tmp==0) vis0=1;
            if (tmp==1) vis1=1;
        }
        if (vis0&&vis1) 
        {
            ans=c*(n-1);
            break;
        }
        c=c*2;
    }
    printf("%lld\n",ans);
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值