记录编号 159311 评测结果 AAAAAAAAAA
题目名称 超牛冠军赛 最终得分 100
用户昵称 Gravatarztx 是否通过 通过
代码语言 C++ 运行时间 1.090 s
提交时间 2015-04-20 19:17:10 内存使用 23.19 MiB
显示代码纯文本
/****************************************\
* Author : ztx
* Title  : [bzoj] 3943: [Usaco2015 Feb]SuperBull
* ALG    : 最大生成树
* CMT    :
* Time   :
\****************************************/

#include <cstdio>
#define Rep(i,l,r) for(i=(l);i<=(r);i++)
#define Rev(i,r,l) for(i=(r);i>=(l);i--)
typedef long long ll ;
int CH , NEG ;
template <typename TP>inline void read(TP& ret) {
    ret = NEG = 0 ; while (CH=getchar() , CH<'!') ;
    if (CH == '-') NEG = true , CH = getchar() ;
    while (ret = ret*10+CH-'0' , CH=getchar() , CH>'!') ;
    if (NEG) ret = -ret ;
}
template <typename TP>inline void reads(TP& ret) {
	while (ret=getchar() , ret<'!') ;
	while (CH=getchar() , CH>'!') ;
}

#include <algorithm>

#define  maxn  2010LL
#define  maxm  2000010LL

struct EDGE {
	int u,v,w ;
	bool operator < (const EDGE& b) const 
	{ return w > b.w ; }
} a[maxm] ;

int n , x[maxn] , tot ;
ll ans ;

int par[maxn] = {0} ;
inline int GetAnc(int u) { return par[u]?par[u]=GetAnc(par[u]):u; }
inline bool Union(int u,int v) {
	u=GetAnc(u),v=GetAnc(v);
	if (u==v) return false ;
	par[u]=v;return true ;
}

int main() {
int i , j , cnt ;
	#define READ
	#ifdef  READ
		freopen("superbull.in" ,"r",stdin ) ;
		freopen("superbull.out","w",stdout) ;
	#endif
	read(n) ;
	Rep (i,1,n) read(x[i]) ;
	ans = tot = 0 ;
	Rep (i,1,n) Rep (j,i+1,n) {
		tot ++ ;
		a[tot].u = i , a[tot].v = j ;
		a[tot].w = x[i]^x[j] ;
	}
	std::sort(a+1,a+tot+1) ;
	cnt = 0 ;
	Rep (i,1,tot)
		if (Union(a[i].u,a[i].v)) if (ans+=a[i].w,++cnt==n-1) break ;
	printf("%lld\n",ans) ;
	#ifdef  READ
		fclose(stdin) ; fclose(stdout) ;
	#else
		getchar() ; getchar() ;
	#endif
	return 0 ;
}