@994495jj
2017-08-01T13:10:56.000000Z
字数 1538
阅读 861
201708
#include<bits/stdc++.h>using namespace std;#define fi first#define se second#define pb push_back#define sz(a) (int)a.size()#define mp make_pair#define rep(i, a, b) for(int i=(a); i<(b); i++)#define de(a) cout<<#a<<"="<<a<<endl;typedef long long ll;typedef pair<int, int> pii;typedef vector<int> vi;//--------const int N=500005;int n;int a[N],f[N][40][2];struct Trie {int nex[N*40][2];int cnt[N*40];ll add[N*40];int tot,root;int newNode() {memset(nex[tot],-1,sizeof(nex[tot]));cnt[tot]=add[tot]=0;return tot++;}void init() {tot=0;root=newNode();}void upd(ll x,int c,int ii) {int now=root;for(int i=29;i>=0;--i) {int v=((x>>i)&1);if(nex[now][v]==-1) {nex[now][v]=newNode();}now=nex[now][v];cnt[now]+=c;add[now]+=1ll*c*f[ii][i][v^1];}}ll qry(ll x,int ii) {ll res=0;int now=root;for(int i=29;i>=0;--i) {int v=((x>>i)&1);int ta=add[nex[now][v^1]];int tb=cnt[nex[now][v^1]];res=res+ta-1ll*tb*f[ii][i][v];now=nex[now][v];}return res;}}tr;int main() {int T;scanf("%d",&T);while(T--) {///scanf("%d",&n);///inittr.init();memset(f,0,sizeof(f));///readrep(i,1,n+1) {scanf("%d",a+i);for(int j=29;j>=0;--j) {++f[i][j][(a[i]>>j)&1];}}///get frep(i,1,n+1) {rep(j,0,30) {rep(k,0,2) {f[i][j][k]+=f[i-1][j][k];}}}///solverep(i,1,n+1) tr.upd(a[i],1,i);ll ans=0;rep(i,1,n+1) {tr.upd(a[i],-1,i);ans=ans+tr.qry(a[i],i);}printf("%lld\n",ans);}return 0;}
