坑点:结果会爆int的范围。
传送门:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=13895
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
const long long MAXN = 100005;
long long Bit[MAXN<<1];
long long a[MAXN];
long long pre[MAXN];
long long eng[MAXN];
void Insert(long long x,long long value) {
for(long long i = x ; i <= MAXN ; i += (i & -i)) {
Bit[i] += value;
}
}
long long Query(long long x) {
long long ret = 0;
for(long long i = x ; i ; i -= (i & -i)) {
ret += Bit[i];
}
return ret;
}
void Deal_with() {
long long T,n;
scanf("%lld",&T);
while(T--) {
scanf("%lld",&n);
for(long long i = 1 ; i <= n ; i++) {
scanf("%lld",a+i);
}
memset(Bit,0,sizeof(Bit));
memset(pre,0,sizeof(pre));
for(long long i = 1 ; i <= n ; i++) {
pre[i] = Query(a[i]-1);
Insert(a[i],1);
//prlong longf("%d : %d\n",i,pre[i]);
}
//puts("");
memset(Bit,0,sizeof(Bit));
memset(eng,0,sizeof(eng));
for(long long i = n; i >= 1 ;i --) {
eng[i] = Query(a[i]-1);
Insert(a[i],1);
//prlong longf("%d : %d\n",i,eng[i]);
}
long long ans = 0;
for(long long i = 1 ; i <= n ; i++) {
ans += pre[i] * (n - i - eng[i]);
ans += (i - pre[i] - 1) * (eng[i]);
}
printf("%lld\n",ans);
}
}
int main(void) {
//freopen("a.in","r",stdin);
Deal_with();
}