本文主要是介绍hdu 2491 pingpong,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
树状数组。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 100006
int a[maxn];
int n=maxn;
int lowbit(int i)
{return i&(-i);
}
int Sum(int i)
{int sum=0;while(i>=1){sum+=a[i];i-=lowbit(i);}return sum;
}
void Update(int i,int tem)
{while(i<=n){a[i]+=tem;i+=lowbit(i);}
}
int main()
{__int64 sum;int t;int m,i;int b[20004],zx[20004],zd[20004],yx[20004],yd[20004];scanf("%d",&t);while(t--){scanf("%d",&m);for(i=1;i<=m;i++)scanf("%d",&b[i]);memset(a,0,sizeof(a));for(i=1;i<=m;i++){Update(b[i],1);zx[i]=Sum(b[i]-1);zd[i]=Sum(maxn-2)-Sum(b[i]);}memset(a,0,sizeof(a));for(i=m;i>=1;i--){Update(b[i],1);yx[i]=Sum(b[i]-1);yd[i]=Sum(maxn-2)-Sum(b[i]);}sum=0;for(i=1;i<=m;i++)sum+=zx[i]*yd[i]+zd[i]*yx[i];printf("%I64d\n",sum);}return 0;
}
这篇关于hdu 2491 pingpong的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!