关于离散化的疑惑(?
  • 板块P1908 逆序对
  • 楼主Zlc晨鑫
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/8/5 18:16
  • 上次更新2023/11/4 11:54:34
查看原帖
关于离散化的疑惑(?
297555
Zlc晨鑫楼主2021/8/5 18:16

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?

2021/8/5 18:16
加载中...