# 第一种离散化:重复元素离散值相同
```cpp
const int maxn=1e5+10;
int a[maxn], t[maxn], b[maxn];
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",a[i]),t[i]=a[i];
sort(t+1,t+n+1);
m=unique(t+1,t+1+n)-t-1;//求出的m为不重复的元素的个数
for(int i=1; i<=n; i++)
b[i]=lower_bound(t+1,t+1+m,a[i])-t;
//a[i]为原来的数组,b[i]为离散化后的数组
```
老是感觉,常数是不是有点大,不知是否有更优的算法
补充一个(这个常数应该小一些):
```cpp
struct kkl{
int v,id;
}a[MAX];
bool cam(kkl a,kkl b)
{
return a.v<b.v;
}
void discrete()
{
int cnt=0;
a[0].v=-1;
sort(a+1,a+n+1,cam);
for(int i=1;i<=n;i++)
{
if(a[i].v!=a[i-1].v) t[a[i].id]=cnt+1,cnt++;
else t[a[i].id]=cnt;
}
}
```
但是这个并不具有普适性