pku hdu pingpong

来源:互联网 发布:注册淘宝店铺流程 编辑:程序博客网 时间:2024/06/05 02:07

树状数组

 

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct TT{    long long num,id;}a[100010];int n;long long num[100010],tree[100010],tree2[100010];bool cmp(TT a,TT b){    return a.num<b.num;}int lowbit(int n){    return n&(-n);}long long getsum(int x)//左边比X小的{    long long sum=0;    for(int i=x;i>=1;i-=lowbit(i))        sum+=tree[i];    return sum;}void update(int x){    for(int i=x;i<=n;i+=lowbit(i))    tree[i]++;}long long getsum2(int x)//左边比X大的{    long long sum=0;    for(int i=x;i<=n;i+=lowbit(i))        sum+=tree2[i];    return sum;}void update2(int x){    for(int i=x;i>=1;i-=lowbit(i))    tree2[i]++;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        memset(tree,0,sizeof(tree));        memset(tree2,0,sizeof(tree2));        scanf("%d",&n);        for(int i=1;i<=n;i++)        {            scanf("%d",&a[i].num);            a[i].id=i;        }        sort(a+1,a+n+1,cmp);        for(int i=1;i<=n;i++) num[a[i].id]=i;        long long sum=0;        for(int i=1;i<=n;i++)        {            int x=num[i];            long long  t1=getsum(x);//左边比他小的            update(x);            long long t2=getsum2(x);            update2(x);//左边比他大的            long long t3=num[i]-t1-1;//右边比他小的            long long t4=(n-num[i])-t2;//右边比他大的            sum+=t1*t4+t2*t3;        }        cout<<sum<<endl;    }    return 0;}