→题目链接←
又是一道水题,又是一道翻译及其坑人的题
翻译里每个数是1~230...原文是1~2^30
太差劲了
暴力建边然后跑最大生成树
代码:
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#define ll long long
using namespace std;
struct node{
int s,t,len;
node(int x,int y,int z){s=x,t=y,len=z;}
friend bool operator < (node a,node b){
return a.len>b.len;
}
};
int n;
int a[2020];
int fa[2020];
ll ans=0;
vector<node>e;
int getroot(int x){
if(fa[x]==x)return x;
return fa[x]=getroot(fa[x]);
}
int main(){
scanf("%d",&n);
for(int i=1; i<=n; i++){
scanf("%d",&a[i]);
fa[i]=i;
}
for(int i=1; i<=n; i++){
for(int j=i+1; j<=n; j++){
e.push_back(node(i,j,a[i]^a[j]));
}
}
sort(e.begin(),e.end());
int sum=1;
for(int i=0; i<e.size(); i++){
node t=e[i];
t.s=getroot(t.s);
t.t=getroot(t.t);
if(t.s!=t.t){
fa[t.s]=t.t;
ans+=t.len;
sum++;
if(sum==n)break;
}
}
printf("%lld\n",ans);
return 0;
}
翻译里每个数是1~230...原文是1~2^30
太差劲了