hdu6059 字典树维护数位统计异或对数

来源:互联网 发布:retrofit post json 编辑:程序博客网 时间:2024/06/07 03:22
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N=5e5+5;void read(int &ret){ret=0;char ch=getchar();while(ch<'0'||ch>'9') ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) ret=ret*10+ch-'0';return ret;}int nxt[N*30][2];int siz[N*30];int ss[N*30];int sum[30][2];int er[30],bit[30];int cnt;ll ans;void add(int x){    int p=1;    for(int i=29;i>=0;i--)    {        int cur=x/er[i];        if(!nxt[p][cur])            nxt[p][cur]=++cnt;        int li,ri;        li=nxt[p][cur];        ri=nxt[p][cur^1];        if(ri)            ans+=1LL*(siz[ri]-1)*siz[ri]/2+1LL*siz[ri]*(sum[i][cur^1]-siz[ri])-ss[ri];        ss[li]+=sum[i][cur]-siz[li];        siz[p=li]++;        sum[i][cur]++;        x&=(er[i]-1);    }}int main(){    for(int i=0;i<30;i++)er[i]=1<<i;    int t;    read(t);    while(t--)    {        int n;        read(n);        memset(nxt,0,sizeof(nxt));        memset(siz,0,sizeof(siz));        memset(sum,0,sizeof(sum));        memset(ss,0,sizeof(ss));        cnt=1;        ans=0;        for(int i=0;i<n;i++)        {            int x;            read(x),add(x);        }        printf("%I64d\n",ans);    }}
原创粉丝点击