离散化
结构体:
int n,i,b[N];
struct stu{
int x,id;
bool operator<(stu &stu1)const{
return x<stu1.x;
}
}s[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&s[i].x);
s[i].id=i;
}
sort(s+1,s+1+n);
for(i=1;i<=n;i++)b[s[i].id]=i;
for(i=1;i<=n;i++)printf("%d ",b[i]);
}
STL(unique大法)
int n,i,a[N],b[N];
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(a+1,a+1+n);
int len=unique(a+1,a+1+n)-a-1;
for(i=1;i<=n;i++){
b[i]=lower_bound(a+1,a+1+len,b[i])-a;
}
for(i=1;i<=n;i++)printf("%d",b[i]);
return 0;
}
STL(map大法)
int n,i,a[N],b[N],cnt;
map<int,int>mp;
int main(){
scanf("%d"&n);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(a+1,a+1+n);
for(i=1;i<=n;i++)
mp[a[i]]=++cnt;
for(i=1;i<=n;i++)
printf("%d ",mp[b[i]]);
return 0;
}
一些特殊情况
$\quad \ \ $ 当我们想要把数之间的相邻关系表示出来时,普通的离散化就会使数和数之间全部挨在一起,那种中间隔了一个数及以上的两数关系就会消失。
$\quad \ \ $ 只需要稍加改动即可(这里拿unique方法演示),在处理时判一下两数是否相邻,若不相邻就在过程数组后插入中间相隔的一个数,再排序。
int a[N],b[N],n,sum;
int main(){
scanf("%d%d",&n,&m);
sum=n;
for(int i=1;i<=n;++i)sanf("%d",&a[i]),b[i]=a[i];
sort(b+1,b+1+n);
for(int i=2;i<=n;++i)if(b[i]-b[i-1]>1)b[++sum]=b[i-1]+1;
sort(b+1,b+1+sum);
int len=unique(b+1,b+1+sum)-b-1;
for(int i=1;i<=n;++i)a[i]=lower_bound(b+1,b+1+len,a[i])-b;
for(int i=1;i<=n;i++)printf("%d\n",a[i]);
//这种方法会失掉原先数据,时间复杂度相对较高。
}