树状数组求逆序数

#include<map>
#include<vector>
#include<unordered_set>
#include<unordered_map>
#include<list>
#include<queue>
#include<deque>
#include<stack>
#include<iostream>
#include<set>
using namespace std;
class BinaryIndexTree {
public:
    int get_sum(int i) {
        i += 1;
        vector<int>& data = this->sum_array;
        int  ret = 0;
        while (i) {
            ret += data[i];
            i -= lower_bit(i);
        }
        return ret;
    }

    void update(int i, int value) {
        i += 1;
        vector<int>& data = this->sum_array;
        while (i < data.size()) {
            data[i] += value;
            i += lower_bit(i);
        }
    }

    void init(const vector<int>& data) {
        this->sum_array = vector<int>(data.size() + 1, 0);
        for (int i = 0; i < data.size(); ++i) {
            this->update(i, data[i]);       
        }
    }
private:
    int lower_bit(int i) {
        return i & (-i);
    }

    vector<int> sum_array;
};
int main() {
    BinaryIndexTree bit;
    int n;
    cin>>n;
    int tmp;
    vector<int> data;
    int max_val = numeric_limits<int>::min();
    int min_val = numeric_limits<int>::max();
    for (int i = 0; i < n; ++i) {
        cin>>tmp;
        data.push_back(tmp);
        max_val = max(max_val, data[i]);
        min_val = min(min_val, data[i]);
    }
    for (int i = 0; i < data.size(); ++i) {
        data[i] -= min_val;
    }

    vector<int> data_tmp(max_val - min_val + 1, 0);
    bit.init(data_tmp);
    int ret = 0;
    for (int i = 0; i < data.size(); ++i) {
        bit.update(data[i], 1);
        ret += bit.get_sum((int)data.size()) - bit.get_sum(i);
    }
    cout<<"result:\t"<<ret<<endl;
    return 0;
}
点赞