#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e5 + 10;
int n;
ll tree[N], a[N], b[N];
int lowbit(int x)
{
return x & -x;
}
void update(int x, int v)
{
while (x <= n)
{
tree[x] += v;
x += lowbit(x);
}
}
ll query(ll x)
{
int sum = 0;
while (x)
{
sum += tree[x];
x -= lowbit(x);
}
return sum;
}
int main()
{
// 1 2 1e9 1 2 3 离散化
cin >> n;
ll sum = 0;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
b[i] = a[i];
}
sort(a + 1, a + 1 + n);
for (int i = 1; i <= n; i++)
{
b[i] = lower_bound(a + 1, a + 1 + n, b[i]) - a;
}
for (int i = 1; i <= n; i++)
{
update(b[i], 1);
sum += i - query(b[i]);
}
cout << sum << endl;
}
树状数组求逆序对
最新推荐文章于 2025-04-30 16:36:16 发布