三种离散化

Posted tieway59

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三种离散化相关的知识,希望对你有一定的参考价值。

 

等有空再测试

```cpp

#define  debug(x) cerr<<#x<<" = "<<x<<endl
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 5;
const int inf = 0x3f3f3f3f;
int n = 10, m, ans;
int a[] = {1, 55, 777, 5, 89, 433, 242, 55555555, 242, 777};
vector<int> hush(a, a + n);
int b[10], c[10];
void initHush1() {
    sort(hush.begin(), hush.end());
    auto it = unique(hush.begin(), hush.end());
    hush.resize(distance(hush.begin(), it));
}
inline int getId1(int x) {
    return distance(hush.begin(), lower_bound(hush.begin(), hush.end(), x));
}
void initHush2() {
    for (int i = 0; i < n; ++i) {
        b[i] = a[i];
    }
    sort(b, b + n);
    m = unique(b, b + n) - b;
}
inline int getId2(int x) {
    return lower_bound(b, b + m, x) - b;
}
struct Node {
    int val, pos;
    bool operator<(const Node &T) const {
        if (val == T.val)return pos < T.pos;
        return val < T.val;
    }
} V[10];
void initHush3() {
    for (int i = 0; i < n; ++i) {
        V[i].val = a[i];
        V[i].pos = i;
    }
    sort(V, V + n);
    for (int i = 1, j = 0; i < n; i++) {
        if (i == 1 || V[i].val != V[i - 1].val)j++;
        c[V[i].pos] = j;
    }
}
int getId3(int pos){
    return c[pos];
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    initHush1();
    initHush2();
    initHush3();
    debug(getId1(1));
    debug(getId1(55555));
    debug(getId2(1));
    debug(getId2(55555));
    debug(getId3(1));
    debug(getId3(5));
    return 0;
}
/*
8 5
1 4
3 6
4 5
4 6
4 7
*/

```

以上是关于三种离散化的主要内容,如果未能解决你的问题,请参考以下文章

算法学习——离散化(整数离散化)

#(离散化基础)知识扩展:利用离散化原理进行算法优化

离散化的认识

离散化

离散化总结

CodeForces 19D Points(离散化+线段树+单点更新)