离散化

什么是 离散化 ???

一些数字,它们的范围很大(0-1e9),但是个数不多(1-1e5),并且这些数本身的数字大小不重要,重要的是这些数字之间的相对大小

第一种离散化

包含重复元素,并且相同元素离散化后也要相同

蒟蒻代码

const int N=1e5 + 5;
int book[N],a[N];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i], book[i]=a[i];
    sort(book+1,book+n+1);	// 排序
    m=unique(book+1,book+n+1)-book-1;	// 去重
    for(int i=1;i<=n;i++)
        a[i]=lower_bound(book+1,book+m+1,a[i])-book;	// 一一建立映射关系
}

第二种离散化

复杂度低

  1. 包含重复元素,并且相同元素离散化后不相同
  2. 不包含重复元素,并且不同元素离散化后不同

符合这两个条件的其中一个, 使用

蒟蒻代码

struct node{
    int x;
    int idx;
    bool operator <(const node& n) const{
        return x<n.x;
    }
};

const int N=1e5+5;
int n;
node a[N];
int book[N];

int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i].x, a[i].idx=i;

    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++){
        book[a[i].idx]=i;   // book[i] 表示 原索引为 i 的元素, 离散化后的位置
    }
    for(int i=1;i<=n;i++){
        a[i].x=book[a[i].idx];  // 将离散化后的值赋给 a[i].x
    }
    // for(int i=1;i<=n;i++) cout<<a[i].idx<<" ";
    // cout<<endl;
    // for(int i=1;i<=n;i++) cout<<a[i].x<<" ";
    return 0;
}
posted @ 2021-08-22 20:11  不爱喝橙子汁的橙子  阅读(57)  评论(0编辑  收藏  举报