代码思路参考
using namespace std;
struct Node{
int val, pos;
} a[100010];
bool cmp(Node n1, Node n2){
return n1.val > n2.val;
}
int b[100010], tree[100010];
void add(int x, int v){
while (x <= 4){
tree[x] += v;
x += (x & -x);
}
}
int query(int x){
x--;
int res = 0;
while (x){
res += tree[x];
x -= (x & -x);
}
return res;
}
int main(){
// 先对原数组逆序(从大到小),然后离散化
// 10 5 3 5
a[1] = {10, 1};
a[2] = {5, 2};
a[3] = {3, 3};
a[4] = {5, 4};
sort(a + 1, a + 1 + 4, cmp);
int cnt = 1;
for (int i = 1; i <= 4; ++i) {
if(i != 1 && a[i].val != a[i-1].val){
cnt++;
}
b[a[i].pos] = cnt;
}
// 求逆序对
int ans = 0;
for (int i = 1; i <= 4; ++i) {
add(b[i], 1);
ans += query(b[i]);
}
printf("%d", ans);
return 0;
}