0
点赞
收藏
分享

微信扫一扫

树状数组求逆序对

​​代码思路参考​​

#include <iostream>
#include <algorithm>

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;
}


举报

相关推荐

0 条评论