剑指Offer——JZ35.数组中的逆序对【树状数组】

题目传送门


剑指Offer——JZ35.数组中的逆序对【树状数组】_第1张图片


题解

  • 非常简单的树状数组应用
  • 需要离散化,离散后编号的的逆序对和之前相同

AC-Code

class Solution {
#define lowbit(x) (x&-x)
private:
    const int mod = 1e9 + 7;
    const static int maxn = 2e5 + 7;
    struct NODE {
        int val, pos;
        NODE(int v = 0, int p = 0):val(v), pos(p) {}
    }a[maxn];
    int c[maxn] = {0};
    
public:
    int InversePairs(vector<int> data) {
        int ans = 0;
        for(int i = 0; i < data.size(); ++i) {
            a[i + 1].pos = i + 1;
            a[i + 1].val = data[i];
        }
        sort(a + 1, a + 1 + data.size(), [](NODE a, NODE b)-> bool { return a.val < b.val; });
        for(int i = 1; i <= data.size(); ++i) {
            add(a[i].pos, 1);
            ans = (ans + i - getsum(a[i].pos)) % mod;
        }
        return ans;
    }
    void add(int i, int x) {
        while(i < maxn) {
            c[i] += x;
            i += lowbit(i);
        }
    }
    int getsum(int i) {
        int res = 0;
        while(i > 0) {
            res += c[i];
            i -= lowbit(i);
        }
        return res;
    }
 #undef lowbit(x)
};

你可能感兴趣的:(Linux)