对于逆序对,我们可以用树状数组的方式来求,但是值得注意的是,我们逆序对一般求的是比这个元素小的个数(位置可以是前或者后),那么求比这个元素大的个数怎么办,我们可以用 i - query() !!!
每个元素交换的个数就是在它之前且比它大和在它之后比它小的元素个数之和
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
const int N = 1e6 + 5;
int a[N];
int b[N];
int c[N];
int lowbit(int x) { return x & (-x); }
void add(int x, int p) {
for (int i = x; i <= N-1; i += lowbit(i)) {
b[i] += p;
}
}
int query(int x) {
int sum = 0;
for (int i = x; i; i -= lowbit(i)) {
sum += b[i];
}
return sum;
}
signed main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
a[i] += 1;
}
// 开始算自己后面比自己小的个数
for (int i = n; i >= 1; i--) {
c[i] += query(a[i]-1);
add(a[i], 1);
}
memset(b, 0, sizeof b);
for (int i = 1; i <= n; i++) {
c[i] += (i - 1 - query(a[i]));
add(a[i], 1);
}
int ans = 0;
for (int i = 1; i <= n; i++) {
ans += ((c[i] + 1) * c[i]) / 2;
}
cout << ans;
return 0;
}