RT,这是我自己学的离散化。
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 5e5 + 10;
int a[N], v[N], c[N], m, n;
int lowbit(int x)
{
return x & (~x + 1);
}
// 离散化begin
void init()
{
sort(v + 1, v + n + 1);
m = unique(v + 1, v + n + 1) - v - 1;
}
int ask(int x)
{
return lower_bound(v + 1, v + m + 1, x) - v;
}
// 离散化end
// 树状数组begin
void add(int x, int k)
{
for ( ; x <= m; x += lowbit(x))
c[x] += k;
}
int query(int x)
{
int ans = 0;
for ( ; x; x -= lowbit(x))
ans += c[x];
return ans;
}
// 树状数组end
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
{
scanf("%d", &a[i]);
v[i] = a[i];
}
init();
long long ans = 0;
for (int i = 1; i <= n; ++i)
{
add(ask(a[i]), 1);
ans += i - query((ask(a[i])));
// 所有数的个数-小于等于x的数的个数=大于x的数的个数
}
printf("%lld\n", ans);
return 0;
}
可是题解里面那种写cmp的离散化是啥啊?
这两个的复杂度一样吗qwq?