求前缀和后缀
代码如下
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int t,n,prema[100005],premi[100005],sufma[100005],sufmi[100005];
int a[20005];
int bit1[100005],bit2[100005];
void add(int i,int *bit)
{
while(i<=100000) {
bit[i]++;
i+=i&-i;
}
}
int sum(int i,int *bit)
{
int s=0;
while(i>0) {
s+=bit[i];
i-=i&-i;
}
return s;
}
int main()
{
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
memset(bit1,0,sizeof(bit1));
memset(bit2,0,sizeof(bit2));
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
premi[i]=sum(a[i],bit1); prema[i]=i-1-premi[i];
add(a[i],bit1);
}
for(int i=n;i>=1;i--) {
sufmi[i]=sum(a[i],bit2); sufma[i]=n-i-sufmi[i];
add(a[i],bit2);
}
long long ans=0;
for(int i=1;i<=n;i++) {
ans+=1ll*premi[i]*sufma[i];
ans+=1ll*prema[i]*sufmi[i];
}
printf("%lld\n",ans);
}
}