AC代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
const int ma = 100000;
int m[ma];
int lmax[ma],lmin[ma], rmax[ma], rmin[ma];
int cnt[ma<<2];
int lowbit(int t)
{
return t & -t;//取出t中的最后一个1
}
int sum(int end)
{
int s = 0;
while(end > 0){
s += cnt[end];
end -= lowbit(end);
}
return s;
}
void update(int pos)
{
while(pos <= ma){
cnt[pos]++;
pos += lowbit(pos);
}
}
int main()
{
int t, n;
scanf("%d", &t);
while(t--){
scanf("%d", &n);
for(int i =1; i<=n; i++)
scanf("%d", &m[i]);
memset(lmax, 0, sizeof(lmax));
memset(lmin, 0, sizeof(lmin));
memset(rmax, 0, sizeof(rmax));
memset(rmin, 0, sizeof(rmin));
memset(cnt, 0, sizeof(cnt));
for(int i =1; i<=n; i++){
update(m[i]);
lmax[i] = sum(ma) - sum(m[i]);//计算左边大的个数
lmin[i] = sum(m[i]-1);//计算左边小的个数
}
memset(cnt, 0, sizeof(cnt));
for(int i=n; i>=1; i--){
update(m[i]);
rmax[i] = sum(ma) - sum(m[i]);//计算右边大的个数
rmin[i] = sum(m[i]-1);//计算右边小的个数
}
long long ans=0;
for(int i=1; i<=n; i++) {
ans += lmax[i]*rmin[i] + lmin[i]*rmax[i];
}
printf("%I64d\n", ans);
}
return 0;
}