什么是 离散化 ???
一些数字,它们的范围很大(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; // 一一建立映射关系
}
第二种离散化
复杂度低
- 包含重复元素,并且相同元素离散化后不相同
- 不包含重复元素,并且不同元素离散化后不同
符合这两个条件的其中一个, 使用
蒟蒻代码
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;
}