一直WA,错在add 操作时,我把上限设成n。。。
枚举每一个数,记录在它左边且比他小的数,在它右边且比他小的数,然后随便乘一下就好。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#define ll long long
using namespace std;
const int maxn=20100;
int a[maxn];
int dp[maxn];
int dpp[maxn];
int b[100100];
int n;
int lowbit(int x)
{
return x&(-x);
}
void add(int x)
{
for(int i=x;i<=100100;i+=lowbit(i))
{
b[i]+=1;
}
}
int query(int x)
{
int sum=0;
for(int i=x;i>0;i-=lowbit(i))
{
sum+=b[i];
}
return sum;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
memset(b,0,sizeof(b));
memset(dpp,0,sizeof(dpp));
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
add(a[i]);
dp[i]=query(a[i]-1);
}
memset(b,0,sizeof(b));
for(int i=n;i>=1;i--)
{
add(a[i]);
dpp[i]=query(a[i]-1);
}
ll ans=0;
for(int i=1;i<=n;i++)
{
ans+=(ll)dp[i]*(n-dpp[i]-i)+(ll)dpp[i]*(i-dp[i]-1);
}
printf("%lld\n",ans);
}
}