AcWing 788. 逆序对的数量
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int nums[N], tr[N];
vector<int> dc; //离散化的数组
int Idx(int x){
return lower_bound(dc.begin(), dc.end(), x) - dc.begin() + 1; //返回索引
}
int lowbit(int x){
return x & -x;
}
void add(int x){
for(; x < N; x += lowbit(x)) ++tr[x];
}
ll ask(int x) // 1~x的和
{
ll res = 0;
for(; x; x -= lowbit(x)) res += tr[x];
return res;
}
int main()
{
int n;
scanf("%d", &n);
for(int i = 0; i < n; ++i)
{
scanf("%d", &nums[i]);
dc.push_back(nums[i]);
}
//离散化数组
sort(dc.begin(), dc.end());
dc.erase(unique(dc.begin(), dc.end()), dc.end());
ll ans = 0;
for(int i = n - 1; i >= 0; --i) //倒序来统计逆序对 i > (i - 1) 那么 a[i] < a[i - 1] 就是逆序 所以求前面的数字个数
{
int idx = Idx(nums[i]); //离散后的索引
ans += ask(idx - 1);
add(idx);
}
printf("%lld\n", ans);
return 0;
}
貌似没有归并排序快