1. 程式人生 > >小W與面試

小W與面試

在這裡插入圖片描述
在這裡插入圖片描述
把這個式子分成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