今天是满课的一天,于是我找了个水题,单纯的求逆序对!题目求逆序对
本题的标答似乎是在归并排序的过程中记录交换的次数,不过我灵机一动就拿离散化加上求逆序对的操作求证了一遍,发现也非常能用,而且也是O(nlogn)的复杂度,完全能冲。
代码如下
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> P;
const int maxn = 5e5 + 5;
ll c[maxn << 2], n;
void add(ll t)
{
while (t <= n)
{
c[t]++;
t += t & (-t);
}
}
ll sum(ll t)
{
ll res = 0;
while (t >= 1)
{
res += c[t];
t -= t & (-t);
}
return res;
}
P p[maxn];
ll nxt[maxn];
void M_sort()
{
sort(p + 1, p + 1 + n);
for (int i = 1; i <= n; i++)
{
nxt[p[i].second] = i;
}
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n;i++)
{
ll x;
scanf("%lld", &x);
p[i] = P(x, i);
}
M_sort();
ll ans = 0;
for (int i = n; i >= 1;i--)
{
//printf("%d ", nxt[i]);
int v = n - nxt[i] + 1;
add(v);
ans += i-sum(v);
}
printf("%lld", ans);
}