原題鏈接:點擊打開鏈接
#include <stdio.h>
#include <string.h>
#define MAX 100001
int arr[MAX];
int left_bigger[MAX], right_bigger[MAX], left_lower[MAX], right_lower[MAX];
int lowbit(int i)
{
return i&(-i);
}
void update(int x, int i)
{
while(x <= MAX){
arr[x] += i;
x += lowbit(x);
}
}
int sum(int i)
{
int ans = 0;
while(i > 0){
ans += arr[i];
i -= lowbit(i);
}
return ans;
}
int main()
{
__int64 res;
int t, n, i;
int skill[MAX];
scanf("%d", &t);
while(t--){
scanf("%d", &n);
for(i = 1; i <= n; i ++){
scanf("%d", &skill[i]);
}
res = 0;
memset(arr, 0, sizeof(arr));
for(i = 1; i <= n; i ++){
update(skill[i], 1);
left_lower[i] = sum(skill[i]-1);
left_bigger[i] = i - 1 - left_lower[i];
}
memset(arr, 0, sizeof(arr));
for(i = n; i > 0; i --){
update(skill[i], 1);
right_bigger[i] = sum(MAX)-sum(skill[i]);
right_lower[i] = n - i - right_bigger[i];
}
for(i = 1; i <= n; i ++){
res += left_bigger[i]*right_lower[i]+left_lower[i]*right_bigger[i];
}
printf("%I64d\n", res);
}
return 0;
}