小W與面試
阿新 • • 發佈:2018-11-11
把這個式子分成2部分算就行了sum是算第一部分,add是算第二部分。
需要用到位運算,就是二進位制計算
#include<bits/stdc++.h>
using namespace std;
long long n,a[100005],ans,c[2][100005],tot[2];
void add(int x,bool flag)
{
while(x<=100000)
{
c[flag][x]++;
x+=x^(x&x-1);
}
tot[flag]++;
}
long long sum(int x,bool flag)
{
long long ans= 0;
while(x)
{
ans+=c[flag][x];
x&=x-1;
}
return ans;
}
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(long long bit=1;bit<=100000;bit<<=1)
{
memset(c,0,sizeof(c));
tot[0]=tot[1]=0;
for(int i=1;i<=n;i++)
{
ans+=(tot[!bool(a[i] &bit)]-sum(a[i],!bool(a[i]&bit)))*bit;
add(a[i],bool(a[i]&bit));
}
}
printf("%lld\n",ans);
return 0;
}
來源:zr