版权声明:欢迎大家转载,转载请注明出处 https://blog.csdn.net/hao_zong_yin/article/details/82466684
将近一年没用树状数组了,回顾一下。。。
另外udebug的数据是错的
#include <bits/stdc++.h>
using namespace std;
const int maxn = 200000 + 10;
int t, n, m, a[maxn], C[maxn], l[maxn], r[maxn];
inline int lowbit(int x) { return x & (-x); }
int sum(int x) {
int ret = 0;
while (x > 0) { ret += C[x]; x -= lowbit(x); }
return ret;
}
void add(int x, int d) {
while (x < maxn) { C[x] += d; x += lowbit(x); }
}
int main() {
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
m = 0;
memset(C, 0, sizeof(C));
for (int i = 1; i <= n; i++) scanf("%d", &a[i]), m = max(m, a[i]);
for (int i = 1; i <= n; i++) {
l[i] = sum(a[i]);
add(a[i], 1);
}
memset(C, 0, sizeof(C));;
for (int i = n; i >= 1; i--) {
r[i] = sum(a[i]);
add(a[i], 1);
}
long long ans = 0;
for (int i = 1; i <= n; i++) {
ans += (long long)l[i] * (n-i-r[i]) + (long long)(i-l[i]-1)*r[i];
}
printf("%lld\n", ans);
}
return 0;
}