离散化分两种,一种是含有同元素的离散化,另一种是每一个元素保证不同的离散化,前一种对于后一种也适用。
没有重复元素的离散化
我们只需要将数组里的数排个序,并记录他们原来的位置,就可以完成离散化。
其中b为离散化之后的数组。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,b[100000];
struct node
{
int pos,c;
}a[100000];
int cmp(node x,node y)
{
return x.c<y.c;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].c);
a[i].pos=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
b[a[i].pos]=i;
for(int i=1;i<=n;i++)
printf("%d ",b[i]);
}
有重复元素的离散化
我们要用到unique函数和lower_bound函数。
unique函数的作用是将一个排序好的数组变成排序好且不重复的数组并返回数组末尾的地址,只要减去首地址就可以得到末尾的位置。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[100000],n,b[100000];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(a+1,a+n+1);
int m=unique(a+1,a+n+1)-a-1;
for(int i=1;i<=n;i++)
b[i]=lower_bound(a+1,a+m+1,b[i])-a;//或b[i]=upper_bound(a+1,a+m+1,b[i])-a-1
for(int i=1;i<=n;i++)
printf("%d ",b[i]);
}
b依然为离散化后的数组。