#include <iostream> #include <vector> #include <algorithm> using namespace std; // 树状数组(Binary Indexed Tree)实现 class BIT { private: vector<int> tree; int n; public: BIT(int size) { n = size; tree.resize(n + 1, 0); } void update(int idx, int delta) { while (idx <= n) { tree[idx] += delta; idx += idx & -idx; } } int query(int idx) { int res = 0; while (idx > 0) { res += tree[idx]; idx -= idx & -idx; } return res; } }; int main() { int n; cin >> n; vector<int> arr(n); for (int i = 0; i < n; ++i) { cin >> arr[i]; } // 复制数组用于离散化 vector<int> sorted = arr; sort(sorted.begin(), sorted.end()); // 去重 sorted.erase(unique(sorted.begin(), sorted.end()), sorted.end()); BIT bit(sorted.size()); long long total = 0; // 从后往前处理数组 for (int i = n - 1; i >= 0; --i) { // 找到当前元素在离散化后的数组中的位置 int pos = lower_bound(sorted.begin(), sorted.end(), arr[i]) - sorted.begin() + 1; // 查询比当前元素小的元素数量 total += bit.query(pos - 1); // 更新树状数组 bit.update(pos, 1); } cout << total << endl; return 0; } /************************************************************** Problem: 1215 User: mc002 Language: C++ Result: Accepted Time:8 ms Memory:2076 kb ****************************************************************/