不是很显然的树状数组题
需要对于每个i,分别统计其左右两侧小于a[i]的人数数量。
注意开long long
注意人数上限2e4但是人的能力上限1e5, 更新C数组的时候要一直更新到1e5
// Decline is inevitable,
// Romance will last forever.
//#include <bits/stdc++.h>
#include <iostream>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <deque>
#include <vector>
using namespace std;
#define mst(a, x) memset(a, x, sizeof(a))
#define INF 0x3f3f3f3f
//#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
#define ll long long
#define int long long
const int maxn = 2e4 + 10;
const int maxm = 1e5;
const int P = 1e9 + 7;
int C[maxm], n, m;
int p[maxn], s[maxn];
int lb(int x) {return x & -x;}
void update(int x, int d) {
while(x <= maxm) { //此处注意
C[x] += d;
x += lb(x);
}
}
int query(int x) {
int res = 0;
while(x) {
res += C[x];
x -= lb(x);
}
return res;
}
int a[maxn];
void solve() {
cin >> n;
mst(C, 0);
for(int i = 1; i <= n; i++)
cin >> a[i];
int ans = 0;
for(int i = 1; i <= n; i++) {
update(a[i], 1);
p[i] = query(a[i]-1);
}
mst(C, 0);
for(int i = n; i > 0; i--) {
update(a[i], 1);
s[i] = query(a[i]-1);
}
for(int i = 1; i <= n; i++)
ans += p[i]*(n-i-s[i]) + s[i]*(i-1-p[i]);
cout << ans << '\n';
}
signed main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
// int T; scanf("%d", &T); while(T--)
int T; cin >> T; while(T--)
solve();
return 0;
}