ZOJ 3870 Team Formation(二进制找规律)
#include <bits/stdc++.h> #define N 100000 #define LL long long #define U unsigned using namespace std; int cas=1,T; int n,a[N+10],bit[32],hb[32],b[32]; int main() { //freopen("1.in","w",stdout); //freopen("1.in","r",stdin); //freopen("1.out","w",stdout); for(int i=0;i<32;i++) bit[i]=1<<i; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",a+i); sort(a,a+n); memset(hb,0,sizeof(hb)); memset(b,0,sizeof(b)); LL ans=0; for(int i=n-1;i>=0;i--) { int hib=-1; for(int j=30;j>=0;j--) { if(a[i]>=bit[j]) { if(hib==-1) { //printf("%d\n",b[j]); ans+=b[j]; hib=j; hb[j]++; } if(!(a[i]&bit[j])) { b[j]++; } } } //printf("%d\n",ans); } printf("%lld\n",ans); } //printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC); return 0; }