昨天的BC打的真是。。。。感冒发烧流鼻涕,好吧,还是水平不行啊,树状数组的应用太不熟练了,又重新温习了一遍,今天终于把此题a了。看别人写的树状数组是砍掉一半的线段树,好吧,现在还不是深有体会,只能说逆序对数和这道题是会了,还得多加练习。
#include<cstdio>
#include<cstring>
#define LL long long
using namespace std;
const int maxn =50010;
int T,a[maxn],bit[maxn],n;
int lowbit(int x)
{
return x&(-x);
}
int query(int x)
{
int res=0;
while(x)
{
res+=bit[x];
x-=lowbit(x);
}
return res;
}
int insert(int x)
{
while(x<=n)
{
bit[x]++;
x+=lowbit(x);
}
}
int l[maxn];
int main()
{
scanf("%d",&T);
while(T--)
{
memset(l,0,sizeof(l));
memset(a,0,sizeof(a));
memset(bit,0,sizeof(bit));
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
for(int i=1; i<=n; i++)
{
l[i]=query(a[i]);
insert(a[i]);
}
int cot=0;
LL sum=0;
memset(bit,0,sizeof(bit));
for(int i=n; i>=1; i--)
{
cot+=query(n)-query(a[i]);
sum+=(LL)cot*(LL)l[i-1];
insert(a[i]);
}
printf("%lld\n",sum);
}
return 0;
}